docker compose:postgresql创建数据库、用户传递和授予权限

docker compose:postgresql创建数据库、用户传递和授予权限,postgresql,docker,docker-compose,archlinux,Postgresql,Docker,Docker Compose,Archlinux,我有以下docker compose文件: version: '3' services: web: build: context: ./django_httpd_mod_wsgi ports: - "8000:80" db: build: context: ./postgresql volumes: - db-data:/var/lib/postgres/data volumes: db-data: 我

我有以下docker compose文件:

version: '3'
services:
  web:
    build:
      context: ./django_httpd_mod_wsgi
    ports:
     - "8000:80"
  db:
    build:
      context: ./postgresql
    volumes:
       - db-data:/var/lib/postgres/data
volumes:
  db-data:
我正在使用archlinux构建psotgresql映像:

以下是我的postgresql Dockerfile:

FROM archlinux/base

RUN yes | pacman -S postgresql

RUN mkdir /run/postgresql/
RUN chown -R postgres:postgres /run/postgresql/

USER postgres

RUN initdb -D /var/lib/postgres/data

RUN psql -c 'CREATE DATABASE btgapp;' 
RUN psql -c "CREATE USER simha WITH PASSWORD 'krishna';" 
RUN psql -c 'GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;'

CMD ["/usr/bin/postgres","-D","/var/lib/postgres/data"]
当我尝试这样做时:

docker-compose up
我得到一个错误:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/run/postgresql/.s.PGSQL.5432"?
ERROR: Service 'db' failed to build: The command '/bin/sh -c psql -c 'CREATE DATABASE dbname;'' returned a non-zero code: 2
我知道在通过/usr/bin/postgres-D/var/lib/postgres/data启动postgresql服务器之后,必须运行psql-CREATE-database dbname

但是我不能在Dockerfile中启动多个命令。那么如何做到这一点


选项是启动脚本。但是,很难看到postgres作为单个进程运行。

基于这些评论,我将尝试在这里回答

我认为你应该选择postgres 11的阿尔卑斯山形象。我会在这里解释原因

官方的码头工人的图像有很多好处,在开始之前你应该考虑。

升级路径很简单-当图像中包装的应用程序的新版本发布时,官方docker图像在大多数情况下都会随之更新。通常,这些更改会尊重映像已建立的配置约定。例如环境变量、启动细节。因此,用户可以简单地更改堆栈中的标记,并进行升级。当然,可能会有破坏性的更改-始终检查此项。 庞大的用户群——当像postgres这样的图像在2019年被下载超过1000万次时,这不仅意味着它很受欢迎,而且从本质上来说,它可以保证图像已经过彻底的测试。任何基本的bug都已经被清除了,你将很容易地使用图像。 针对大小和性能进行了优化-您可以确保已注意到许多细节,最小化图像大小并最大限度地提高性能。许多项目在几个不同的linux发行版上发布应用程序。像postgres一样,他们发布debian和基于alpine的图像。alpine映像较小,而debian略大,但如果需要安装额外的软件包,您可以访问庞大的debian软件包存储库。 易于配置-官方映像的维护者通常非常了解其用户库的用例。他们试图让我们作为开发人员和管理员的生活更轻松。上帝保佑他们。官方图片通常在docker hub登录页上有一些非常好的文档,或者有一个指向github repo的链接,其中README.md将介绍常见用例。我发现这些说明值得从头到尾仔细阅读。 我知道你想保持图像的小,但是你知道什么-postgres项目已经覆盖了你的用例

最新的alpine postgres图像标记为11 alpine,其压缩足迹为28 MB,解压缩足迹为70 MB。而您想要开始使用的archlinux/base映像的压缩基本内存占用为153MB,解压缩大小为445MB。那是在你介绍博士后之前

此外,您希望在启动时创建的数据库和用户可以在官方postgres映像的环境变量中单独处理。像这样:

docker run-d-命名一些博士后\ -e POSTGRES_PASSWORD=mysecretpassword\ -e POSTGRES_USER=simha\ -e POSTGRES_DB=btgapp\ 博士后:11人 如果这还不包括数据库所需的初始化,那么可以将.sql脚本和.sh脚本复制到映像中的特殊位置,并在启动时执行。为此,您可以如下方式扩展其图像:

init-user-db.sh

!/bin/bash set-e
psql-v ON_ERROR_STOP=1-username$POSTGRES_USER-dbname$POSTGRES_DB根据评论,我将在这里尝试回答

我认为你应该选择postgres 11的阿尔卑斯山形象。我会在这里解释原因

官方的码头工人的图像有很多好处,在开始之前你应该考虑。

升级路径很简单-当图像中包装的应用程序的新版本发布时,官方docker图像在大多数情况下都会随之更新。通常,这些更改会尊重映像已建立的配置约定。例如环境变量、启动细节。因此,用户可以简单地更改堆栈中的标记,并进行升级。当然,可能会有破坏性的更改-始终检查此项。 庞大的用户群——当像postgres这样的图像在2019年被下载超过1000万次时,这不仅意味着它很受欢迎,而且从本质上来说,它可以保证图像已经过彻底的测试。任何基本的bug都已经被清除了,你将很容易地使用图像。 针对大小和性能进行了优化-您可以确保已注意到许多细节,最小化图像大小并最大限度地提高性能。许多项目在几个不同的linux上发布应用程序 发行版。像postgres一样,他们发布debian和基于alpine的图像。alpine映像较小,而debian略大,但如果需要安装额外的软件包,您可以访问庞大的debian软件包存储库。 易于配置-官方映像的维护者通常非常了解其用户库的用例。他们试图让我们作为开发人员和管理员的生活更轻松。上帝保佑他们。官方图片通常在docker hub登录页上有一些非常好的文档,或者有一个指向github repo的链接,其中README.md将介绍常见用例。我发现这些说明值得从头到尾仔细阅读。 我知道你想保持图像的小,但是你知道什么-postgres项目已经覆盖了你的用例

最新的alpine postgres图像标记为11 alpine,其压缩足迹为28 MB,解压缩足迹为70 MB。而您想要开始使用的archlinux/base映像的压缩基本内存占用为153MB,解压缩大小为445MB。那是在你介绍博士后之前

此外,您希望在启动时创建的数据库和用户可以在官方postgres映像的环境变量中单独处理。像这样:

docker run-d-命名一些博士后\ -e POSTGRES_PASSWORD=mysecretpassword\ -e POSTGRES_USER=simha\ -e POSTGRES_DB=btgapp\ 博士后:11人 如果这还不包括数据库所需的初始化,那么可以将.sql脚本和.sh脚本复制到映像中的特殊位置,并在启动时执行。为此,您可以如下方式扩展其图像:

init-user-db.sh

!/bin/bash set-e
psql-v ON_ERROR_STOP=1-username$POSTGRES_USER-dbname$POSTGRES_DB没有使用官方POSTGRES映像的任何特殊原因?它在启动时支持这种类型的行为。因为我所有的网站和redis都使用相同的操作系统。这也会节省空间。有什么特别的原因你没有使用官方的postgres图片吗?它在启动时支持这种类型的行为。因为我所有的网站和redis都使用相同的操作系统。这也会节省空间。非常感谢您的解释。我可以换成docker的官方形象。但我也在试图理解如何使用archlinux来实现它。只是为了学习。因此,如果我将Docker compose与多个容器一起使用,那么我不能对postgresql使用Docker run命令,因为它必须在web启动之前启动。我认为在我的postgresql Dockerfile中,我必须尝试使用ENTRYPOINT而不是CMD。还有关于postgres:11 alpine Dockerfile是如何制作的文档吗。学习创建自己的docker文件可以让我们更加了解docker文件和docker容器的工作原理,因此,创建这样的自己的图像绝对是一个不错的项目。祝你愉快,先生!非常感谢。我习惯于Arch linux repos、aur和安装软件包以及漂亮的wiki页面。所以我很高兴在docker的帮助下我可以继续我的Arch Linux非常感谢你的解释。我可以换成docker的官方形象。但我也在试图理解如何使用archlinux来实现它。只是为了学习。因此,如果我将Docker compose与多个容器一起使用,那么我不能对postgresql使用Docker run命令,因为它必须在web启动之前启动。我认为在我的postgresql Dockerfile中,我必须尝试使用ENTRYPOINT而不是CMD。还有关于postgres:11 alpine Dockerfile是如何制作的文档吗。学习创建自己的docker文件可以让我们更加了解docker文件和docker容器的工作原理,因此,创建这样的自己的图像绝对是一个不错的项目。祝你愉快,先生!非常感谢。我习惯于Arch linux repos、aur和安装软件包以及漂亮的wiki页面。所以我很高兴在docker的帮助下,我可以继续使用我的Arch linux
FROM postgres:11-alpine
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh