我天真地期望这个命令在一个正在运行的容器中运行bash shell:
docker run "id of running container" /bin/bash
看起来是不可能的,我得到了一个错误:
2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
因此,如果我想在运行容器中运行bash shell(例如用于诊断目的)
我必须在里面运行SSH服务器并通过SSH登录吗?
也许在开发容器时,您也像我一样被误导,从vm的角度进行思考。我的建议是:尽量不要。
容器就像任何其他过程一样。实际上,出于调试目的,您可能想要“附加”到它们(考虑/proc//env或strace -p),但这是非常特殊的情况。
通常你只是“运行”进程,所以如果你想修改配置或读取日志,只需创建一个新容器,并确保通过共享目录、写入stdout(这样docker日志就可以工作了)或类似的东西在容器外面写入日志。
出于调试目的,您可能希望先启动一个shell,然后启动代码,然后按CTRL-p + CTRL-q以保持shell不变。这样你就可以使用:
docker attach <container_id>
如果您希望调试容器,因为它正在做一些您不希望它做的事情,请尝试调试它:https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container-initialization
由于情况正在发生变化,目前访问正在运行的容器的推荐方式是使用nsenter。
你可以在这个github存储库上找到更多信息。但通常你可以这样使用nsenter:
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
或者你可以使用包装器docker-enter:
docker-enter <container_name_or_ID>
关于这个话题的一个很好的解释可以在Jérôme Petazzoni的博客上找到:
为什么不需要在docker容器中运行sshd
实际上有一种方法可以让容器中有一个外壳。
假设您的/root/run.sh启动进程、进程管理器(管理器)或任何东西。
使用一些gnu屏幕技巧创建/root/runme.sh:
# Spawn a screen with two tabs
screen -AdmS 'main' /root/run.sh
screen -S 'main' -X screen bash -l
screen -r 'main'
现在,在tab 0中有守护进程,在tab 1中有交互式shell。Docker在任何时候附加,以查看容器内发生了什么。
另一个建议是使用所有必要的工具在产品映像之上创建一个“开发包”映像,包括这个屏幕技巧。