我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
当前回答
找到停止的容器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
其他回答
在容器启动后,docker似乎不能更改入口点。但是您可以设置一个自定义入口点,并在下次重新启动入口点时更改入口点的代码。
例如,你像这样运行一个容器:
docker run --name c --entrypoint "/boot" -v "./boot":/boot $image
下面是引导入口点:
#!/bin/bash
command_a
当你需要用不同的命令重新启动c时,你只需要改变启动脚本:
#!/bin/bash
command_b
并重新启动:
docker restart c
在Entrypoint脚本的顶部添加一个检查
Docker确实需要将其作为一个新特性来实现,但这里有另一个变通选项,用于你有一个在成功或失败后终止的Entrypoint,这可能会使调试变得困难。
如果您还没有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。我用我的入口点脚本运行容器,就像这样:
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脚本以重新运行它。
找到停止的容器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
这并不是你所要求的,但是如果你想要的只是检查文件,你可以在一个停止的容器上使用docker export。
mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR
我把@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构建。