如何使用不同的命令启动停止的Docker容器?
我想用一个不同的命令启动一个停止的Docker容器,就像默认的命令崩溃 – 这意味着我不能启动容器,然后使用“docker exec”。
基本上我想开始一个shell,所以我可以检查容器的内容。
幸运的是我用-it选项创build了容器!
find您已停止的容器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
注意:
上面的步骤只需启动一个具有相同文件系统状态的停止的容器。 这对于快速调查来说很不错。 但环境variables,networkingconfiguration,附加卷和其他人员没有被inheritance,您应该明确指定所有这些参数。
从这里借用了启动已停止的容器的步骤:(最新评论) https://github.com/docker/docker/issues/18078
编辑这个文件(对应于你停止的容器):
vi /var/lib/docker/containers/923...4f6/config.json
改变“path”参数指向你的新命令,例如/ bin / bash。 您也可以设置“参数”参数来传递参数给命令。
重新启动docker服务:
service docker restart
列出你的容器,并确保命令已经改变:
docker ps -a
启动容器并附加到它,你现在应该在你的壳!
docker start -ai mad_brattain
使用Docker 1.7.1在Fedora 22上工作。
注意:如果你的shell不是交互式的(比如你没有用-it选项创build原始容器),你可以改变命令为“/ bin / sleep 600”或“/ bin / tail -f / dev / null”给你足够的时间去做“docker exec -it CONTID / bin / bash”作为获取shell的另一种方式。
将检查添加到您的入口点脚本的顶部
Docker实际上需要将其作为一项新function来实现,但是这里有另外一种解决方法,用于在成功或失败后终止入口点的情况,这会使debugging变得困难。
如果您还没有一个入口脚本,请创build一个运行您的容器所需的任何命令的脚本。 然后,在这个文件的顶部,将这些行添加到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
这将导致脚本运行一次,创build一个文件,指示它已经运行(在容器的虚拟文件系统中)。 然后您可以重新启动容器来执行debugging:
docker start container_name
当你重新启动容器时,会findalready_ran
文件,使得Entrypoint脚本与cat
(它永远等待永远不会input的内容,但保持活动状态)等待。 然后你可以执行一个debuggingbash
会话:
docker exec -i container_name bash
当容器正在运行时,如果需要以这种方式进行debugging,则还可以删除already_ran
并手动执行entrypoint.sh
脚本以重新运行该脚本。
没有指定容器是否正在退出,只是你的代码崩溃,你需要看看容器中发生了什么。 如果不存在,这是另一个可能的解决scheme。
使用docker ps
获取容器标识
docker exec -it 665b4a1e17b6 /bin/sh
如果入口点被设置为有问题,那么也可以按照Dmitriusan的答案中的build议重写。 还应该注意的是,您可以使用docker attach
附加到任何正在运行的容器。 那么多解决scheme的解决scheme 我只是没有看到需要承诺的形象。 这似乎没有必要。
Docker exec文档 – https://docs.docker.com/engine/reference/commandline/exec/
Docker附加文档 – https://docs.docker.com/engine/reference/commandline/attach/
在Docker容器中手动运行命令。
我正在运行docker版本7.03.1-ce,我找不到config.json。
我尝试编辑config.v2.json,但它不起作用,我不想提交方法,因为我不想制作新的图像。 我通过在容器内手动运行命令find替代方法。
启动容器
docker start <container>
访问bash
docker exec -ti <container> bash
手动运行命令
root@<container_id># service <command> start
要么
docker exec -d <container> service <command> start #Note: run this in another terminal while docker exec is attach.
我拿@ Dmitriusan的答案,并成为一个别名:
“prev_container_id”prev_container / $ prev_container_id“&& docker run -it –entrypoint = bash”prev_container“”prev_container_id =“$(docker ps -aq | head -n1)”&& docker commit“$ prev_container_id” / $ prev_container_id“”
把它添加到你的~/.bashrc
别名文件中,你将得到一个漂亮的新的docker-run-prev-container
别名,它会把你放到前一个容器的shell中。
有助于debugging失败的docker build
。
docker container start <CONTAINER_ID>
我其实不同意这两个答案。 如果你只是想看看容器里有什么,那么你可以运行这个命令来获得一个shell。 无需全部或任何configuration更改入口点。
docker run -it <image_name> bash