【问题标题】:docker compose: postgresql create db, user pass and grant permissiondocker compose:postgresql 创建数据库,用户通过并授予权限
【发布时间】:2019-03-19 14:12:31
【问题描述】:

我有以下 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 -c CREATE DATABSE "dbname"

但我无法在 Dockerfile 中启动多个命令。那么该怎么做呢。

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

【问题讨论】:

  • 您没有使用官方 postgres 图像的任何特殊原因?它在启动时支持这种类型的行为。
  • 我想试试archlinux。因为我的所有网络和 redis 也使用相同的操作系统。它也将节省空间。

标签: postgresql docker docker-compose archlinux


【解决方案1】:

根据cmets,我会在这里尝试回答。

我相信您应该使用 postgres 11-alpine 映像。我将尝试在这里解释原因。

官方 docker 镜像有很多好处,在开始使用之前您应该始终考虑这些好处。

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

我了解您希望保持图像较小,但您知道吗 - postgres 项目已经涵盖了您的用例。

标记为 11-alpine 的最新 alpine postgres 图像的压缩空间为 28 MB,解压缩后为 70MB。虽然您想要开始使用的 archlinux/base 图像具有 153MB 的压缩基本占用空间和 445MB 的解压缩大小。那是在你介绍 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 脚本)复制到映像中的一个特殊位置——它们将在启动时执行。为此,您可以像这样扩展他们的图像:

init-user-db.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:

Dockerfile

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

(取自the postgres description on docker hub)

最后——我建议您不要优先考虑图像所基于的发行版,而不是可用性和可维护性。 Docker 使我们能够在容器中运行应用程序,而无需真正关心容器内的发行版是什么。反正都是linux。归根结底,我希望您像我一样想要一个稳定的 postgres 数据库容器。这是我从官方 postgres 图像中得到的。

我希望我能帮助您评估您对此的选择。

【讨论】:

  • 非常感谢您的解释。我可以转到官方 docker 镜像。但我也试图了解如何使用archlinux来做到这一点。只是为了学习。因此,如果我将 Docker 组合与多个容器一起使用,那么我不能对 postgresql 使用 docker run 命令,因为它必须在 web 启动之前启动。我认为在我的 postgresql Dockerfile 中,我必须尝试使用​​ ENTRYPOINT 而不是 CMD。还有任何关于如何制作 postgres:11-alpine Dockerfile 的文档。学习创建自己的 Dockerfile 让我们更加了解。
  • 出于对 Dockerfiles 和 docker 容器如何工作的更多了解的原因——像这样创建一些自己的镜像绝对是一个好项目。享受先生!
  • 谢谢。我习惯于 Arch linux repos、aur 和安装包和漂亮的 wiki 页面。所以我很高兴在 docker 的帮助下我可以继续使用我的 Arch linux
猜你喜欢
  • 2021-02-05
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多