Docker 组成:postgresql create db,user pass and grant permission

o8x7eapl  于 2023-03-22  发布在  Docker
关注(0)|答案(1)|浏览(102)

我有以下的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作为一个单独的进程运行。

0lvr5msh

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映像。像这样:

docker run -d --name some-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=simha \
  -e POSTGRES_DB=btgapp \
postgres:11-alpine

如果这还不包括数据库所需的初始化,那么您可以将.sql脚本(和.sh脚本)复制到映像中的一个特殊位置-它们将在启动时执行。为此,您可以像这样扩展它们的映像:

一米九十一

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER simha;
    CREATE DATABASE btgapp;
    GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;
EOSQL

然后使用像这样的Dockerfile

一米十一米一

FROM postgres:11-alpine
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh

(This取自the postgres description on docker hub
最后,我建议你不要优先考虑镜像所基于的发行版,而不是可用性和可维护性。Docker使我们能够在容器中运行应用程序,而不必太在意容器中的发行版。反正都是linux。在一天结束时,我希望你像我一样想要一个稳定的postgres数据库容器。这是我从官方postgres镜像中得到的。
我希望我能帮你评估你的选择。

相关问题