将自定义配置位置添加到Docker Postgres映像中,以保留其访问参数

时间:2019-10-21 18:06:06

标签: postgresql docker docker-compose

我写了一个这样的Dockerfile:

FROM postgres:11.2-alpine
ADD ./db/postgresql.conf /etc/postgresql/postgresql.conf
CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]

它只是将自定义配置位置添加到通用Postgres映像中。

现在我有以下docker-compose服务说明

db:
  build:
    context: .
    dockerfile: ./db/Dockerfile
  environment:
    POSTGRES_PASSWORD passwordhere
    POSTGRES_USER: user
    POSTGRES_DB: db_name
  ports:
    - 5432:5432
  volumes:
    - ./run/db-data:/var/lib/db/data

问题是,如果添加此配置选项,我将无法再使用这些凭据远程连接到数据库。没有那条CMD行,它就可以正常工作。

如果我在"postgres"中加上CMD,则由于底层脚本本身在其前面而具有相同的效果。

2 个答案:

答案 0 :(得分:1)

只要所有文件都在需要的位置,我相信设置的唯一问题是您从CMD中省略了一个实际的可执行文件-仅指定了选项。您需要实际运行postgres:

CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

应该可以!

编辑以回应OP在下面的第一条评论

首先,我确实确认无论CMD中是否存在“ postgres”,行为都不会改变。就是你说的那样向前!

然后,我认为所使用的特定postgresql.conf一定存在问题。如果我们能弄清楚默认文件是什么,那么事实证明我们可以!

如何从postgres映像中获取现有的postgres.conf

1。创建具有以下内容的docker-compose.yml

version: "3"

services:
  db:
    image: postgres:11.2-alpine
    environment:
      - POSTGRES_PASSWORD=passwordhere
      - POSTGRES_USER=user
      - POSTGRES_DB=db_name
    ports:
      - 5432:5432
    volumes:
      - ./run/db-data:/var/lib/db/data

2。使用

启动服务
$ docker-compose run --rm --name=postgres db

3。在另一个终端中,获取此版本中使用的文件的位置:

$ docker exec -it postgres psql --dbname=db_name --username=user --command="SHOW config_file"
               config_file
------------------------------------------
 /var/lib/postgresql/data/postgresql.conf
(1 row)

4。查看默认postgresql.conf的内容

$ docker exec -it postgres cat /var/lib/postgresql/data/postgresql.conf

5。替换本地配置文件

现在我们要做的就是用已知工作状态配置的内容替换本地配置文件./db/postgresql.conf并根据需要对其进行修改。

数据库对象仅创建一次!

数据库对象仅由postgres容器(source)创建一次。因此,在开发数据库参数时,必须删除它们以确保我们处于干净状态。

以下是
核(小心!)选项 (1)删除所有退出的Docker容器,然后
(2)删除所有未附加到容器的Docker卷:

$ docker rm $(docker ps -a -q) -f && docker volume prune -f

所以现在我们可以确保从干净的状态开始!

最终设置

让我们将Dockerfile带回到图片中(就像您在问题中一样)。

docker-compose.yml

version: "3"

services:
  db:
    build:
      context: .
      dockerfile: ./db/Dockerfile
    environment:
      - POSTGRES_PASSWORD=passwordhere
      - POSTGRES_USER=user
      - POSTGRES_DB=db_name
    ports:
      - 5432:5432
    volumes:
      - ./run/db-data:/var/lib/db/data

连接到数据库

现在我们要做的就是从一个干净的状态开始构建。

# ensure all volumes are deleted (see above)
$ docker-compose build
$ docker-compose run --rm --name=postgres db

我们现在可以(仍然)连接到数据库:

$ docker exec -it postgres psql --dbname=db_name --username=user --command="SELECT COUNT(1) FROM pg_database WHERE datname='db_name'"

最后,我们可以在已知的工作状态下编辑postgres.conf

答案 1 :(得分:0)

根据this other discussion,您的CMD命令仅包含参数,而缺少命令。试试:

CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]