首页 > 解决方案 > 如何启动具有有效初始设置的 postgres docker 容器?

问题描述

将 postgres docker 配置文件设置为

Dockerfile

FROM postgres:12-alpine

USER postgres

RUN chmod 0700 /var/lib/postgresql/data &&\
    initdb /var/lib/postgresql/data &&\
    echo "host all  all    0.0.0.0/0  md5" >> /var/lib/postgresql/data/pg_hba.conf &&\
    echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf
    pg_ctl start &&\
    psql -c "ALTER USER postgres WITH ENCRYPTED PASSWORD 'mypassword';"

EXPOSE 5432

使用 docker-compose 将其部署在服务器上

version: "3.8"
services:
  postgresql:
    build:
      context: ./postgresql
      dockerfile: Dockerfile
    image: postgresql
    container_name: postgresql
    hostname: postgresql

构建它时,它可以成功完成。但是当它上升时,得到了

docker-compose up postgresql
Creating postgresql ... done
Attaching to postgresql
postgresql       | Error: Database is uninitialized and superuser password is not specified.
postgresql       |        You must specify POSTGRES_PASSWORD to a non-empty value for the
postgresql       |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
postgresql       |
postgresql       |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
postgresql       |        connections without a password. This is *not* recommended.
postgresql       |
postgresql       |        See PostgreSQL documentation about "trust":
postgresql       |        https://www.postgresql.org/docs/current/auth-trust.html
postgresql exited with code 1

查看docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
1lsls201qs0h        postgresql          "docker-entrypoint.s…"   2 minutes ago       Exited (1) 2 minutes ago                       postgresql

服务器上的文件权限

ls -la postgresql/
Total 4
drwxr-xr-x 2 runuser runuser  24  April 14 01:02 .
drwxr-xr-x 5 runuser runuser  54  April 14 01:02 ..
-rwxr-xr-x 1 runuser runuser 541  April 14 01:02 Dockerfile

ls -la docker-compose.yaml
-rwxr-xr-x 1 runuser runuser 1110  April 14 01:02 docker-compose.yaml

我在本地测试了它,它可以工作。容器可以正常运行,初始密码设置也可以。但是在服务器上,是否应该更改任何权限?

标签: postgresqldockerdocker-compose

解决方案


您不需要通过修改 postgress dockerfile 来创建镜像。只需下载镜像并运行镜像。编写您自己的单独pg_hba.conf并将postgresql.conf其保存到主机目录。现在在容器运行时挂载该目录。检查卷并将其添加到 docker compose。

volume:
- host_directory_that_contains_conf/pg_hba.conf: /var/lib/postgresql/data/pg_hba.conf
- host_directory_that_contains_conf/postgresql.conf: /var/lib/postgresql/data/postgresql.conf

在你的 docker-compose 中添加这个卷并运行 docker compose up。还有另一种使用 env 变量的替代解决方案。您可以将所有这些添加到 ENVIRONMENT 变量中。


推荐阅读