为什么docker工人在启动后立即退出?

我想configurationdocker-compose在Ubuntu 16.04中使用GreenPlum db。 这是我的docker-compose.yml:

 version: '2' services: greenplum: image: "pivotaldata/gpdb-base" ports: - "5432:5432" volumes: - gp_data:/tmp/gp volumes: gp_data: 

问题是当我用sudo docker-compose up docker运行它时sudo docker-compose up开始后立即构buildGrrenPlum dbclosures。 它看起来像这样:

 greenplum_1 | 20170602:09:01:01:000050 gpstart:e1ae49da386c:gpadmin-[INFO]:-Starting Master instance 72ba20be3774 directory /gpdata/master/gpseg-1 greenplum_1 | 20170602:09:01:02:000050 gpstart:e1ae49da386c:gpadmin-[INFO]:-Command pg_ctl reports Master 72ba20be3774 instance active greenplum_1 | 20170602:09:01:02:000050 gpstart:e1ae49da386c:gpadmin-[INFO]:-No standby master configured. skipping... greenplum_1 | 20170602:09:01:02:000050 gpstart:e1ae49da386c:gpadmin-[INFO]:-Database successfully started greenplum_1 | ALTER ROLE dockergreenplumn_greenplum_1 exited with code 0 <<----- Here 

其实,当我刚刚启动它与sudo docker run pivotaldata/gpdb-base没关系。

docker工人怎么了?

首先, 小心谨慎地运行这个镜像 :镜像看起来很糟糕, Docker Hub上的信息表明它既不是“官方”的,也不是“支持”的;

2017-01-09:Toolsmiths审查了这个图像; 这不是我们创造的。 我们对这是否是最新的或是否有效做出承诺。 如果您是所有者,请随时发送电子邮件至pa-toolsmiths@pivotal.io,并有兴趣与我们就此图片进行合作。

当使用来自Docker Hub的图片时,build议使用官方图片,或者在不可用时select自动构build (在这种情况下,可以validation图片的源代码以查看构build图片的用途)。

认为这个图像是从这个GitHub存储库构build的,这意味着它已经有一年多的时间没有更新了,并且使用了一个过时的(CentOS 6.7)基础镜像,这个镜像有很多关键的漏洞

回到你的问题;

我尝试着用docker-composedocker run启动镜像,两者对我来说都是一样的。

看着这个图像,它被devise成交互式运行,或被用作基本图像(并覆盖命令)。

我检查了这个图像,看看容器的命令是什么。

 docker inspect --format='{{json .Config.Cmd}}' pivotaldata/gpdb-base ["/bin/sh","-c","echo \"127.0.0.1 $(cat ~/orig_hostname)\" >> /etc/hosts && service sshd start && su gpadmin -l -c \"/usr/local/bin/run.sh\" && /bin/bash"] 

所以,这是容器启动时执行的内容。

 echo "127.0.0.1 $(cat ~/orig_hostname)" >> /etc/hosts \ && service sshd start \ && su gpadmin -l -c "/usr/local/bin/run.sh" \ && /bin/bash" 

基于上述情况,容器中没有“foreground”进程,所以/usr/local/bin/run.sh时刻结束,启动了一个bash shell。 一个bty壳没有tty连接,立即退出,在这一点集装箱退出。

运行这个图像

(再一次;谨慎地运行这个图像)

交互式地运行图像,通过传递stdintty-i -t ,或者-it作为简写);

 docker run -it pivotaldata/gpdb-base 

或者可以运行它“分离”,只要还传递了一个tty (添加-d-t标志或-dt作为简写)。 这样做,使容器在后台运行;

 docker run -dit pivotaldata/gpdb-base 

要在docker-compose执行相同的操作,请向您的服务添加一个tty ;

 tty: true 

您的撰写文件将如下所示;

 version: '2' services: greenplum: image: "pivotaldata/gpdb-base" ports: - "5432:5432" tty: true volumes: - gp_data:/tmp/gp volumes: gp_data: