Postgresql 为什么postgres过程没有';是否在执行run/CMD/ENTRYPOINT之前运行?

Postgresql 为什么postgres过程没有';是否在执行run/CMD/ENTRYPOINT之前运行?,postgresql,docker,dockerfile,Postgresql,Docker,Dockerfile,第一次尝试时,我发现这个Dockerfile FROM postgres:9.6-alpine RUN psql ############# this is error message => ERROR [2/2] RUN psql

第一次尝试时,我发现这个
Dockerfile

FROM postgres:9.6-alpine
RUN psql

############# this is error message
 => ERROR [2/2] RUN psql                                                                                                                                                0.6s 
------
 > [2/2] RUN psql:
#6 0.349 psql: could not connect to server: No such file or directory
#6 0.349        Is the server running locally and accepting
#6 0.349        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

所以我认为这个错误的原因不是postgres过程。我测试了一些东西,
CMD psql
ENTRYPOINT psql
,然后当我在构建之后运行这个映像时,所有容器都得到了相同的错误。为什么会出现这些问题?

如果您想使用Docker image直接使用psql, 我有一个解决方案:

阿尔卑斯山:最新版本 运行apk--更新添加postgresql客户端 入口点[“psql”] 之后:

docker构建-t测试。

alias psql='docker run--rm-it测试:最新'
最后开始使用psql:

psql——帮助
演示:

我希望这能帮助您解决问题。

请参阅:

Dockerfile:

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
exec gosu postgres "$BASH_SOURCE" "$@"
docker-entrypoint.sh:

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
exec gosu postgres "$BASH_SOURCE" "$@"

如果在
Dockerfile
中定义了多个
ENTRYPOINT
CMD
,则只会使用最后一个。这意味着您的
CMD psql,ENTRYPOINT psql
将覆盖默认的
psql服务器
start命令,这使得您仍然没有psql服务器进程。

Docker容器只运行一个进程

如果您将图像的
CMD
设置为
psql
,则此操作将代替基础图像的正常
CMD
;您将获得一个PostgreSQL客户端,而不是PostgreSQL服务器

设置
ENTRYPOINT[“psql”]
对我来说真的没有意义,因为它会导致实际的
CMD
附加
psql
;像
psqlbash
这样的命令实际上没有意义。这还将替换基本映像中的大量启动时间脚本。(但是,有关使用它的特定模式,请参见。)

如果
运行psql
,则在构建阶段它实际上在自己的容器中运行。Docker映像不会持久化正在运行的进程,因此这与
CMD
的情况相同:您有一个正在运行
psql
的容器,而没有其他内容,因此没有可供其连接的数据库服务器

在构建过程中,还有三个问题。如果在另一个容器中运行数据库,则映像生成未连接到任何网络,因此无法连接到数据库。如果您计划在连接了一些存储的情况下运行数据库,那么在构建时还不可用。事实上,标准Docker Hub数据库映像的配置使您无法创建包含嵌入数据的数据库映像(因为服务器数据位于声明的
中,对
目录的更改不会持久化)


如果您只是试图运行
psql
,那么即使数据库在容器中,也可以直接运行它

docker run-d-p5678:5432 postgres
psql-p5678
或者,如果在某种程度上无法接受安装标准客户端工具,则可以启动第二个Docker容器,连接到第一个Docker容器。两个容器需要位于同一Docker网络上。
psql
客户机容器可以使用标准的
postgres
图像,但指定在图像名称后运行的备用命令

docker网络创建一些网络
docker run-d--net some network--name db postgres
docker run--rm-it--netsomenetwork--name客户端postgres\
psql-hdb

只能有一个
入口点
,它要么是postgres服务器,要么是其他东西。您希望实现什么?在构建阶段运行
psql
似乎真的失败了。如果您无法连接到,则不会运行任何内容。为什么不干脆
docker运行-it--rm containername psql