为什么没有使用“docker run image command”启动容器的日志?

我使用docker run genezys/gitlab:7.5.2命令来创build并启动一个容器:

 [root@localhost ~]# docker run genezys/gitlab:7.5.2 /opt/gitlab/embedded/bin/runsvdir-start: line 34: ulimit: max user processes: cannot modify limit: Operation not permitted /opt/gitlab/embedded/bin/runsvdir-start: line 37: /proc/sys/fs/file-max: Read-only file system [2015-05-05T05:43:02+00:00] INFO: Forking chef instance to converge... ...... 

我可以看到有在terminal输出的日志。

但是当我用docker run genezys/gitlab:7.5.2 /bin/true命令:

 [root@localhost ~]# docker run genezys/gitlab:7.5.2 /bin/true [root@localhost ~]# 

没有输出日志。

为什么没有使用docker run image command启动容器的日志?

那是因为/bin/true CMD(来自docker run genezys/gitlab:7.5.2 /bin/true )会覆盖Dockerfile中定义的原始CMD:

 # Default is to run runit & reconfigure CMD ["/usr/local/bin/gitlab.sh"] 

由于GitLab永远不会运行(使用/bin/true ),它从不输出任何日志。


docker run有一个COMMAND参数:

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 

docker运行“重写docker文件图像默认值”提到:

四个Dockerfile命令在运行时不能被覆盖: FROMMAINTAINERRUNADD
docker run其他一切都有相应的覆盖

这包括CMD

回顾Docker命令行中的可选命令:

 $ sudo docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] 

此命令是可选的,因为创buildIMAGE的人可能已经使用Dockerfile CMD指令提供了默认的COMMAND
作为操作员(从图像运行容器的人员),只要指定一个新的COMMAND ,就可以覆盖该CMD指令。

如果图像也指定了一个ENTRYPOINT那么CMD或者COMMAND作为参数附加到ENTRYPOINT