我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
当前回答
在容器启动后,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脚本以重新运行它。
这并不是你所要求的,但是如果你想要的只是检查文件,你可以在一个停止的容器上使用docker export。
mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR
关于这个问题有很多讨论,所以我想再补充一个我没有立即看到上面列出的:
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 run <IMAGE_NAME>启动了一个容器 然后将一些文件添加到这个容器中 然后我关闭了容器,并尝试使用与上面相同的命令再次启动它。 但当我检查新文件时,它们不见了 当我运行docker ps -a时,我可以看到两个容器。 这意味着每次我运行docker run <IMAGE_NAME>命令时,都会创建新的映像
解决方案: 要在最初创建的容器上运行,请执行以下步骤
Docker ps获取你的容器的容器 docker容器start <CONTAINER_ID>启动现有容器 然后你可以从你离开的地方继续。例如:docker exec -它<CONTAINER_ID> /bin/bash 然后,您可以决定从中创建一个新映像
编辑这个文件(对应于你停止的容器):
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)。