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
?