我写了一个这样的Dockerfile:
FROM postgres:11.2-alpine
ADD ./db/postgresql.conf /etc/postgresql/postgresql.conf
CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]
它只是将自定义配置位置添加到通用Postgres映像。
现在我有以下docker-comort
服务描述
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
问题是如果我添加这个配置选项,我就不能再使用这些凭据远程连接到DB。没有CMD
行,它就可以正常工作。
如果我在CMD
中添加“postgres”
,它具有相同的效果,因为底层脚本将其本身放在前面。
如果所有文件都在它们需要的地方,我相信您设置的唯一问题是您从CMD
中省略了一个实际的可执行文件——仅指定选项。您需要实际运行postgres:
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
这应该工作!
首先,我确实确认了行为不会改变“postgres”是否在CMD
中。正如你所说的。继续!
然后我想使用的特定postgresql. conf
一定有问题。如果我们能弄清楚默认文件是什么…事实证明我们可以!
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
$ docker-compose run --rm --name=postgres db
$ docker exec -it postgres psql --dbname=db_name --username=user --command="SHOW config_file"
config_file
------------------------------------------
/var/lib/postgresql/data/postgresql.conf
(1 row)
$ docker exec -it postgres cat /var/lib/postgresql/data/postgresql.conf
现在我们所要做的就是将本地配置文件./db/postgresql. conf
替换为已知工作状态配置的内容,并根据需要对其进行修改。
postgres容器(源)只创建一次数据库对象。因此,在开发数据库参数时,我们必须删除它们以确保我们处于干净状态。
这是一个核心(小心!)选项,用于
(1)删除所有已退出的Docker容器,然后
(2)删除所有未附加到容器的Docker卷:
$ docker rm $(docker ps -a -q) -f && docker volume prune -f
所以现在我们可以确定从干净的状态开始!
让我们将Dockerfile带回图片中(就像您在问题中所说的那样)。
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
。
根据其他讨论,您的CMD
命令只有参数并且缺少命令。尝试:
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]