泊坞窗撰写:postgresql创建数据库,用户传递和授予权限

时间:2019-03-19 14:12:32

标签: 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:

我正在使用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

我了解到我必须通过psql -c CREATE DATABSE "dbname"启动Postgresql服务器之后才能运行/usr/bin/postgres -D /var/lib/postgres/data

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

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

1 个答案:

答案 0 :(得分:1)

根据评论,我将尝试在此处回答。

我认为您应该使用postgres 11高山图像。我会在这里解释原因。

正式的Docker映像具有许多好处,您在开始创建自己的映像之前应始终予以考虑。

  1. 升级路径很简单-释放包装在映像中的应用程序的新修订版时,大多数情况下,官方docker映像也会随之更新。并且通常,更改遵循映像已建立的配置约定。例如环境变量,启动细节。这样,用户可以简单地更改堆栈中的标签并进行升级。当然可能会有重大更改-请务必进行检查。
  2. 庞大的用户群-当类似postgres的图像被下载超过10百万次(2019年)时,这不仅意味着它很受欢迎,而且从本质上讲可以保证该图像具有经过彻底测试。所有基本错误都已被清除,您将可以轻松使用图像。
  3. 针对大小和性能进行了优化-您可以确定已将注意力集中在许多细节上,从而最大程度地减少了图像大小并提高了性能。许多项目在几个不同的Linux发行版上发布其应用程序。像postgres一样,它们发布基于debian和基于alpine的图像。 alpine映像较小,而debian映像稍大,但是如果需要安装其他软件包,则可以访问庞大的debian软件包系统信息库。
  4. 简单的配置-官方图片的维护者通常非常了解其用户群的用例。他们试图使我们作为开发人员和管理员的生活更加轻松(上帝保佑他们)。官方映像通常在其docker hub登陆页面上有一些相当不错的文档,或者是指向github repo的链接,其中README.md将覆盖常见的用例。我发现这些说明值得从上至下阅读。

我知道您想缩小图像,但是您知道吗-postgres项目已经涵盖了您的用例。

标记为11-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官方图片得到的。

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