根据我目前阅读的教程,使用"docker run -d"将从image启动一个容器,并且容器将在后台运行。这就是它的样子,我们已经有了container id。
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
但如果我运行“docker ps”,什么都没有返回。
所以我尝试了“docker ps -a”,我可以看到容器已经退出:
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
我做错什么了吗?如何解决此问题?
Dockerfile中应用程序的错误路径:
我正在使用Alpine Linux将应用程序从RHEL服务器迁移到Docker容器。
在构建过程中没有错误,所以我很惊讶地看到容器立即退出!
第一停靠港:
docker logs <containerID>
这揭示了我在Dockerfile中提供给CMD的二进制文件的路径是伪造的:
line 0: /sbin/postfix: not found
好吧,这告诉了我事情是如何被破坏的,但没有具体到哪里:我仍然需要在Alpine Linux中为二进制文件提供正确的路径……
故障排除:
谷歌没有显示它的正确路径,所以我添加了以下一行到我的Dockerfile:
RUN which postfix
然后,我检查了我的构建日志记录(由附加到构建命令的下面命令提供),以检索RUN的值
--progress=plain > /path/to/build.log 2>&1
解决办法:
我删除了这个测试构建,在Dockerfile中提供了正确的路径- /usr/sbin/postfix -到CMD,删除了该后缀的RUN,并运行了另一个构建。
瞧;这个过程现在还没有结束。
所以duff路径导致容器立即退出…
也许这只是我的问题,但在CentOS 7.3.1611和Docker 1.12.6上,我最终不得不使用@VonC和@Christopher Simon发布的答案的组合来可靠地工作。在此之前我所做的任何事情都不会阻止容器在成功运行CMD后退出。我正在启动oracle-xe-11Gr2和sshd。
Dockerfile
...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null
然后添加-d -t和-i运行
docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611
在我用头撞墙几个小时后终于
ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password:
debug1: Authentication succeeded (password).
不管出于什么原因,如果末尾的-f被删除,或者省略了任何-t -d -i选项,上述命令将在执行CMD后退出。