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

其他回答

我找到了一个简单的命令

docker start -a [container_name]

这样就可以了

Or

docker start [container_name]

then

docker exec -it [container_name] bash

在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容器,MariaDB容器在启动时不断崩溃,因为损坏了InnoDB表。

我解决问题的方法是:

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

大多数情况下,人们在修改配置文件时会遇到这种情况,我就是这样做的。我试图通过Vue SPA作为入口点绕过PHP/Apache服务器的CORS。不管怎样,如果你知道你要的文件,对我来说一个简单的解决办法是

复制你从图片中取出的文件: Docker cp bt-php:/etc/apache2/apache2.conf。 局部修复 复制回来 Docker cp apache2.conf bt-php:/etc/apache2 .conf 重新启动容器 *加分-由于这个文件正在修改,将其添加到您的撰写或构建脚本,这样当您做对了,它将被烘焙到图像!

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

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