我有以下的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构建postgresql镜像:
下面是我的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 -c CREATE DATABASE "dbname"
但是我不能在一个Dockerfile中启动多个命令。那么该怎么做呢?
选项是启动一个脚本,但这样就很难看到postgres作为一个单独的进程运行。
1条答案
按热度按时间0lvr5msh1#
根据评论,我将在这里尝试回答。
我相信你应该使用postgres 11-alpine图像,我会在这里解释为什么。
官方的docker镜像有很多好处,你应该在开始自己的镜像之前考虑一下。
1.升级路径简单-当镜像中 Package 的应用程序的新版本发布时,官方Docker镜像在大多数情况下都会沿着更新。并且通常更改会尊重镜像已经建立的配置约定。例如环境变量,启动细节。因此用户可以简单地更改堆栈中的标签。和升级。当然可能会有突破性的变化-总是检查这一点。
1.庞大的用户群-当像postgres这样的图片被下载超过1000万次(2019年)时,这不仅意味着它很受欢迎,而且本质上就像是一个保证,该图片已经经过了彻底的测试。任何基本的bug都已经被清除,你将可以轻松使用该图片。
1.针对大小和性能进行了优化-您可以肯定,我们已经注意到了很多细节,最小化了映像的大小并最大化了性能。许多项目在几个不同的Linux发行版上发布了他们的应用程序。像postgres -他们发布了
debian
和基于alpine
的映像。alpine
映像是较小的一个,而debian
稍大,但如果你需要安装额外的软件包,它可以让你访问庞大的debian软件包库。1.易于配置-官方镜像的维护者通常非常了解其用户群的使用情况。他们试图使我们作为开发人员和管理员的生活更轻松(上帝保佑他们)。官方图片通常在他们的docker hub着陆页上有一些非常好的文档,或者一个Github Repo的链接,其中X1 M4 N1 X将涵盖常见的用例。我发现这些说明值得从上到下好好阅读。
我知道你想保持图像小,但你知道什么-postgres项目已经得到了你的用例覆盖。
最新的alpine postgres镜像标签为
11-alpine
,压缩后占用空间为28 MB,解压缩后为70 MB。而你想开始使用的archlinux/base
镜像压缩后的基本占用空间为153 MB,解压缩后为45 MB。这是在你介绍postgres之前。除此之外,您希望在启动时创建的数据库和用户-可以在环境变量中单独处理官方postgres映像。像这样:
如果这还不包括数据库所需的初始化,那么您可以将
.sql
脚本(和.sh
脚本)复制到映像中的一个特殊位置-它们将在启动时执行。为此,您可以像这样扩展它们的映像:一米九十一
然后使用像这样的
Dockerfile
:一米十一米一
(This取自the postgres description on docker hub)
最后,我建议你不要优先考虑镜像所基于的发行版,而不是可用性和可维护性。Docker使我们能够在容器中运行应用程序,而不必太在意容器中的发行版。反正都是linux。在一天结束时,我希望你像我一样想要一个稳定的postgres数据库容器。这是我从官方postgres镜像中得到的。
我希望我能帮你评估你的选择。