我想用一个不同的命令来启动一个停止的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 export。

mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR

找到停止的容器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

编辑这个文件(对应于你停止的容器):

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)。

在容器启动后,docker似乎不能更改入口点。但是您可以设置一个自定义入口点,并在下次重新启动入口点时更改入口点的代码。

例如,你像这样运行一个容器:

docker run --name c --entrypoint "/boot" -v "./boot":/boot $image

下面是引导入口点:

#!/bin/bash
command_a

当你需要用不同的命令重新启动c时,你只需要改变启动脚本:

#!/bin/bash
command_b

并重新启动:

docker restart c

我有一个docker容器,MariaDB容器在启动时不断崩溃,因为损坏了InnoDB表。

我解决问题的方法是:

从容器中复制docker-entrypoint.sh到本地文件系统(docker cp) 编辑它以包含所需的命令行参数(在我的例子中——innodb-force-recovery=1) 将编辑过的文件复制回docker容器,覆盖现有的入口点脚本。