Answers:
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
inspect
输出转换为用于后续运行的配置?
编辑此文件(与您停止的容器相对应):
vi /var/lib/docker/containers/923...4f6/config.json
更改“路径”参数以指向您的新命令,例如/ bin / bash。您也可以设置“ Args”参数,以将参数传递给命令。
重新启动docker服务(注意,这将停止所有正在运行的容器):
service docker restart
列出您的容器,并确保命令已更改:
docker ps -a
启动容器并连接到它,现在应该在外壳中了!
docker start -ai mad_brattain
使用Docker 1.7.1在Fedora 22上工作。
注意:如果您的外壳不是交互式的(例如,您没有使用-it选项创建原始容器),则可以改为将命令更改为“ / bin / sleep 600”或“ / bin / tail -f / dev / null”给您足够的时间来执行“ docker exec -it CONTID / bin / bash”作为获取shell的另一种方法。
注意2:较新版本的docker具有config.v2.json,您需要在其中更改Entrypoint或Cmd(感谢user60561)。
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
,您需要在其中更改Entrypoint
或Cmd
。
Docker确实需要将其实现为一项新功能,但是这是另一个解决方法,适用于您的入口点在成功或失败后终止的情况,这可能使调试变得困难。
如果您还没有一个Entrypoint脚本,请创建一个可以运行容器所需命令的脚本。然后,在此文件的顶部,将这些行添加到entrypoint.sh
:
# Run once, hold otherwise
if [ -f "already_ran" ]; then
echo "Already ran the Entrypoint once. Holding indefinitely for debugging."
cat
fi
touch already_ran
# Do your main things down here
为了确保cat
保持连接,您可能需要提供一个TTY。我正在使用我的Entrypoint脚本运行容器,如下所示:
docker run -t --entrypoint entrypoint.sh image_name
这将导致脚本运行一次,并创建一个指示其已经运行的文件(在容器的虚拟文件系统中)。然后,您可以重新启动容器以执行调试:
docker start container_name
当您重新启动容器时,already_ran
将找到该文件,从而导致Entrypoint脚本停顿cat
(它将永远等待永远不会出现的输入,但会使容器保持活动状态)。然后,您可以执行调试bash
会话:
docker exec -i container_name bash
在容器运行时,如果需要调试,也可以删除already_ran
并手动执行entrypoint.sh
脚本以重新运行它。
/bin/sh
而不是cat
-然后始终可以在重新启动时进入。您的解决方案动摇了!
我的问题:
docker run <IMAGE_NAME>
docker ps -a
我可以看到两个容器。docker run <IMAGE_NAME>
命令时,都会创建新映像解决方案: 要在您首先创建的同一容器上运行,请遵循以下步骤
docker ps
得到你的容器的容器docker container start <CONTAINER_ID>
启动现有容器docker exec -it <CONTAINER_ID> /bin/bash
docker run <containerID>
我接受了@Dmitriusan的回答,并将其作为别名:
别名docker-run-prev-container ='prev_container_id =“ $(docker ps -aq | head -n1)” && docker commit“ $ prev_container_id”“ prev_container / $ prev_container_id” && docker run -it --entrypoint = bash“ prev_container / $ prev_container_id“'
将其添加到您的~/.bashrc
别名文件中,您将获得一个漂亮的新docker-run-prev-container
别名,该别名会将您放入先前容器中的外壳中。
对调试失败有用docker build
。
这并不是您所要的,但是docker export
如果您要检查文件,则可以在已停止的容器上使用。
mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR
没有指定容器是否正在退出,只是您的代码崩溃了,您需要查看容器中正在发生什么。如果没有退出,这是另一个潜在的解决方案。
使用获取容器ID docker ps
docker exec -it 665b4a1e17b6 /bin/sh
如果将入口点设置为有问题的东西,则也可以按照Dmitriusan的答案中的建议将其覆盖。还应注意,您可以使用附加到任何正在运行的容器docker attach
。这么多解决方案不同的解决方案。我只是看不到需要提交图像。似乎没有必要。
对于泊坞窗EXEC文件- https://docs.docker.com/engine/reference/commandline/exec/
对于泊坞窗文件附上- https://docs.docker.com/engine/reference/commandline/attach/
我实际上不同意这两个答案。如果您只想查看容器中的内容,则可以运行此命令以获取外壳。无需更改所有或任何配置的入口点。
docker run -it <image_name> bash
docker logs <container_id> --follow
并为您提供所需的内容。另一种选择是使用上面的命令,然后在dockerfile中使用相同的命令在该映像上启动崩溃服务,然后从那里调试。
docker container start <CONTAINER_ID>