如何在由docker-compose处理的Postgres Docker容器中运行psql命令?

4
这个问题与这个有关: Docker - How can run the psql command in the postgres container? 但是上面提供的解决方案仅在手动操作时有效,而这里希望使用docker-compose自动化操作。
因此,这个Docker容器可以工作:
FROM postgres
COPY init.sql /docker-entrypoint-initdb.d/

但是这个 Docker 容器失败了:
FROM postgres
RUN psql -U postgres -c "CREATE USER user WITH PASSWORD 'pass';"

因为在运行时,postgresql服务器尚未启动!

有没有办法克服这个限制?


是的,但您需要在容器启动时添加脚本(而不是最后一个“CMD [“postgres”]”命令),并且此脚本将运行psql命令,并以“exec postgres”结束。 - JosMac
@JosMac,我不是很明白你的意思。你所提到的最后一个CMD["postgres"]命令是自动调用的吗?在哪里插入exec postgres呢?...能否给出一个示例? - George Pligoropoulos
@GeorgiosPligoropoulos 你有没有检查过这个问题是否符合你的需求?如何在Docker Postgres脚本中创建用户/数据库 - tgogos
@tgogos,恐怕这并不是有用的,因为手动执行操作的说明已经存在,而明显需要的是在docker中运行。最终我们应该从命令行运行的是 docker-compose up -d。所有步骤,包括创建数据库等都应该自动运行。希望这能更清晰地说明问题。 - George Pligoropoulos
您可以查看此指令:https://dev59.com/nFcP5IYBdhLWcg3wtMH_ - yuen26
1个回答

5

当你将带有脚本的文件夹挂载到Docker容器的/docker-entrypoint-initdb.d/路径下时,你可以在Postgres中运行一些脚本。请参考挂载SQL文件夹的docker-compose.yml文件,Postgres镜像非常好用,每次启动Postgres时都会运行这些脚本...

version: '3.6'

services:  
  my_db:
    image: postgres:alpine
    volumes: ["/somepath/sql/:/docker-entrypoint-initdb.d/"]

/somepath/的文件结构

- docker-compose.yml
- sql
  - new_extension.sql

并且执行 cat sql/new_extension.sql

/* create extension for cureent DB */
CREATE EXTENSION IF NOT EXISTS citext;
/* create extension over the template1 so all created databases after that also have the extension */
\c template1
CREATE EXTENSION IF NOT EXISTS citext;

我很抱歉,我已经尝试过这个方法,但是我可以告诉你问题出在哪里。我知道使用 psql .... 命令可以将数据库备份还原到特定的数据库名称,但我找不到如何在postgresql中使用SQL语句设置当前工作数据库(例如MySQL有USE关键字)。这就是我们发现自己陷入上述情况的原因。但如果您知道,请分享 :) - George Pligoropoulos
我已更新我的回答,如果您切换到template1,那么此后创建的所有数据库也将具有该扩展名... 我不明白您想要实现什么,您能发布您的.sql文件吗? - Mazel Tov
与此问题相关的问题,也提供了上下文:https://dev59.com/fBv8s4cB2Jgan1zn0Hsk - George Pligoropoulos
干得好!这是一个完美的解决方案。谢谢! - CrazyGeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接