在dockerfile中配置postgres



我觉得有点笨,但是。。。

我想要的只是一个dockerfile,它允许我配置数据库和用户来替换像这样的脚本

docker run --name $CONTAINER_NAME  
-p 5432:5432 
-e POSTGRES_PASSWORD=mypass 
-e POSTGRES_DB=mydb 
-d postgres:13.5-alpine
###
### artificial wait here
###
docker exec $CONTAINER_NAME bash -c "psql --username postgres --command "CREATE USER foo WITH SUPERUSER ENCRYPTED PASSWORD 'bar';""

例如,像这样的东西(我想(:

FROM postgres:13.5-alpine
EXPOSE 5432
ENV POSTGRES_DB mydb
ENV POSTGRES_PASSWORD mypass
CMD psql --username postgres --command "CREATE USER foo WITH SUPERUSER ENCRYPTED PASSWORD 'bar';"

除了这会导致

psql: error: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

那么,正确的方法是什么呢?

Dockerfile用于构建映像,并且CMD将在容器运行时运行。所以

docker run --name $CONTAINER_NAME  
-p 5432:5432 
-e POSTGRES_PASSWORD=mypass 
-e POSTGRES_DB=mydb 
-d postgres:13.5-alpine
###
### artificial wait here
###
docker exec $CONTAINER_NAME bash -c "psql --username postgres --command "CREATE USER foo WITH SUPERUSER ENCRYPTED PASSWORD 'bar';""

之所以成功,是因为在您向容器(db(输入SQL查询之前,容器已经启动并运行。但如果您尝试从Dockerfile执行此操作,它实际上会尝试在数据库启动并运行之前运行psql命令,因此会出现连接错误。

你最好的选择是使用Docker Compose并添加一个初始化脚本

version: 3
services: 
db:
image: postgres:13.5-alpine
environment:
POSTGRES_PASSWORD:mypass
POSTGRESS_DB: mydb
volume:
data:/var/lib/postgresql/data
volumes:
data:

像这样的东西(对不起,我是凭记忆打字的。

请参阅https://hub.docker.com/_/postgres有关初始化脚本的更多信息

但它基本上是一个bash脚本,您可以编写它,然后将其传递给dockercompose,以便在容器启动时运行。

最新更新