gpt4 book ai didi

postgresql - docker compose : postgresql create db, 用户通过并授予权限

转载 作者:行者123 更新时间:2023-11-29 12:50:31 26 4
gpt4 key购买 nike

我有以下 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/启动 postgresql 服务器后,我必须运行 psql -c CREATE DATABASE "dbname"数据

但我无法在一个 Dockerfile 中启动多个命令。那么如何做到这一点呢?

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

最佳答案

根据评论,我会尽量在这里回答。

我认为您应该使用 postgres 11-alpine 图像。我将尝试在这里解释原因。

官方 docker 镜像具有许多优势,您在开始自己的镜像之前应始终考虑这些优势。

  1. 升级路径很简单 - 当包含在镜像中的应用程序的新修订版发布时,官方 docker 镜像在大多数情况下会随之更新。通常,更改会遵守镜像已建立的配置约定。例如环境变量、启动细节。这样用户就可以简单地更改堆栈中的标签并进行升级。当然可能会有重大更改 - 请务必检查。
  2. 庞大的用户群 - 当像 postgres 这样的图像被下载超过 1000 万次(2019 年)时,这不仅意味着它很受欢迎,而且本质上可以保证图像具有经过彻底测试。任何基本错误都已被清除,您将可以轻松处理图像。
  3. 针对尺寸和性能进行了优化 - 您可以确信已对大量细节进行了关注,最大限度地减小了图像尺寸并最大限度地提高了性能。许多项目在几个不同的 Linux 发行版上发布他们的应用程序。像 postgres - 他们发布基于 debianalpine 的图像。 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 图像中得到的。

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

关于postgresql - docker compose : postgresql create db, 用户通过并授予权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55243023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com