如何使用不同的命令启动停止的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