我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
当前回答
——entrypoint /bin/bash cont_id_or_name
(对于conven,把你的env, vol挂载在docker-compose.yml)
或者使用docker运行并手动指定所有参数
其他回答
编辑这个文件(对应于你停止的容器):
vi /var/lib/docker/containers/923...4f6/config.json
更改“Path”参数以指向您的新命令,例如/bin/bash.你也可以设置"Args"参数来给命令传递参数。
重新启动docker服务(注意,这将停止所有正在运行的容器,除非你首先启用live-restore):
service docker restart
列出你的容器,并确保命令已经更改:
docker ps -a
启动容器并连接到它,您现在应该在您的shell中!
docker start -ai mad_brattain
使用Docker 1.7.1在Fedora 22上工作。
注意:如果你的shell不是交互式的(例如,你没有创建带有-it选项的原始容器),你可以将命令改为“/bin/sleep 600”或“/bin/tail -f /dev/null”,以给你足够的时间执行“docker exec -it CONTID /bin/bash”作为另一种获得shell的方式。
注2:更新版本的docker有config.v2。json,在那里你需要改变入口点或Cmd(感谢user60561)。
关于这个问题有很多讨论,所以我想再补充一个我没有立即看到上面列出的:
If the full path to the entrypoint for the container is known (or discoverable via inspection) it can be copied in and out of the stopped container using 'docker cp'. This means you can copy the original out of the container, edit a copy of it to start a bash shell (or a long sleep timer) instead of whatever it was doing, and then restart the container. The running container can now be further edited with the bash shell to correct any problems. When finished editing another docker cp of the original entrypoint back into the container and a re-restart should do the trick.
我曾经用它来纠正一个“快速修复”,我黄油手指,不再能够运行正常入口点的容器,直到它被纠正。
我也同意应该有一种更好的方式通过docker来做到这一点:也许可以选择“docker restart”来允许另一个入口点?嘿,也许这已经适用于“——entrypoint”?不确定,没有尝试过,留给读者练习,如果有用请告诉我。:)
对我来说,Docker总是给人留下这样的印象,它是为一个爱好系统而创建的,它在这方面做得很好。 如果某事失败或不起作用,不要指望有专业的解决方案。
也就是说:Docker不仅不支持这些基本的管理任务,还试图阻止它们。
解决方案:
cd /var/lib/docker/overlay2/ 查找| grep someechangedfile #你现在可以在你的容器中看到一个十六进制编码的文件夹/diff中更改的文件 cd hexcoded-folder / diff 创建一个entrypoint.sh(如果存在,请确保备份一个现有的) Cat > entrypoint.sh #!/bin/bash 在((1));做睡眠1;完成; Ctrl + C Chmod +x入口点。sh 码头工人停止 码头工人开始
你现在有你的docker容器运行一个无限循环,而不是原来的入口,你可以执行bash到它,或做任何你需要的。 停止容器后,删除/重命名自定义入口点。
我把@Dmitriusan的回答变成了一个别名:
别名docker-run- prer -container='prev_container_id="$(docker ps -aq | head -n1)"&& docker commit "$prev_container_id" && docker run -it——entrypoint=bash "prev_container/$prev_container_id"
将此添加到~/中。Bashrc别名文件,你会有一个漂亮的新docker-run- prec -container别名,它会把你放到前一个容器的shell中。
有助于调试失败的docker构建。
找到停止的容器id
docker ps -a
提交停止的容器:
该命令将修改后的容器状态保存到名为user/test_image的新映像中:
docker commit $CONTAINER_ID user/test_image
使用不同的入口点启动/运行:
docker run -ti --entrypoint=sh user/test_image
入口点参数描述:
https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime
注意:
上面的步骤只是启动一个具有相同文件系统状态的已停止容器。这对快速调查很有帮助;但是环境变量、网络配置、附加卷和其他东西不是继承的。您应该显式地指定所有这些参数。
启动一个停止的容器的步骤已经从这里借来:(最后的评论)https://github.com/docker/docker/issues/18078