当前位置: 首页 > 知识库问答 >
问题:

如何使用不同的命令启动已停止的Docker容器?

翁阳曜
2023-03-14

我想用不同的命令启动已停止的Docker容器,因为默认命令崩溃——这意味着我不能启动容器,然后使用“docker exec”。

基本上,我想开始一个外壳,这样我就可以检查容器的内容。

幸运的是,我用-it选项创建了这个容器!

共有3个答案

东方高洁
2023-03-14

Docker真的需要将其作为一个新功能来实现,但这里有另一个解决方案,用于在成功或失败后入口点终止的情况,这可能会使调试变得困难。

如果您还没有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。我使用Entrypoint脚本运行容器,如下所示:

docker run -t --entrypoint entrypoint.sh image_name

这将导致脚本运行一次,创建一个文件,表明它已经运行(在容器的虚拟文件系统中)。然后可以重新启动容器以执行调试:

docker start container_name

重新启动容器时,会找到已运行的文件,导致入口点脚本与cat一起暂停(它只会永远等待永远不会出现的输入,但会使容器保持活动状态)。然后可以执行调试bash会话:

docker exec -i container_name bash

在容器运行时,您还可以删除已运行的并手动执行入口点。shscript重新运行它,如果需要这样调试的话。

弓智明
2023-03-14

编辑此文件(对应于已停止的容器):

vi /var/lib/docker/containers/923...4f6/config.json

更改“路径”参数以指向您的新命令,例如 /bin/bash.您也可以设置“Args”参数以向命令传递参数

重新启动docker服务(注意这将停止所有正在运行的容器):

service docker restart

列出您的容器并确保命令已更改:

docker ps -a

启动容器并连接到它,你现在应该在你的外壳里了!

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的较新版本有配置。v2。json,您需要在其中更改Entrypoint或Cmd(感谢user60561)。

赵英哲
2023-03-14
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-运行时要执行的默认命令

以上步骤只需启动一个具有相同文件系统状态的已停止容器。这对于快速调查来说非常好。但是环境变量、网络配置、附加卷和其他人员不是继承的,您应该明确指定所有这些参数。

从这里借用了启动停止的容器的步骤:(最后注释)https://github.com/docker/docker/issues/18078

 类似资料:
  • 问题内容: 我想用另一个命令启动一个停止的Docker容器,因为默认命令崩溃了-这意味着我无法启动该容器,然后使用’docker exec’。 基本上,我想启动一个外壳,以便可以检查容器的内容。 幸运的是,我使用-it选项创建了容器! 问题答案: 提交停止的容器: 此命令将修改后的容器状态保存到新映像中 从另一个入口点开始/运行: 入口点参数描述:https ://docs.docker.com/

  • 问题内容: 我使用以下命令从映像启动docker容器: 当完成后,容器停止(我想这已停止),但它并没有被删除,因为我可以用这个命令来查看它: 有什么办法可以使用相同的参数将此容器保持由生成的数据? 问题答案: 是的,当初始命令完成执行后,容器将停止。 您可以使用以下方法启动已停止的容器: 如果要查看命令的输出,则应添加选项: PS。有一个,但用于重新启动正在运行的容器-我相信情况并非如此。

  • 问题内容: 为了解决我的应用程序的错误并调试问题,该应用程序分布在多个容器中,我经常在容器中编辑文件: 我完全懒惰并安装nano并直接在容器中进行编辑,或者 我将cp文件从容器中移出,对其进行编辑,复制并重新启动容器 这些是进入容器构建新内容之前的中间步骤,这比上述操作要花很多时间(当然,这只是中间/摆弄)。 现在,我经常破坏容器的启动程序,在这种情况下,它是节点脚本或python Web服务器脚

  • 试图修复我的应用程序在多个容器上拆分的错误和调试问题,我经常编辑容器中的文件: > 要么我完全懒惰,直接在容器中安装nano并进行编辑,要么 我将文件从容器中取出,编辑它,复制回来,然后重新启动容器 这些都是为容器构建新内容之前的中间步骤,这比执行上述操作要长得多(当然,这只是中间步骤)。 现在我经常破坏容器的启动程序,在破坏情况下是节点脚本或python webserver脚本,两者通常都因语法

  • 问题内容: 如何查看Docker中正在运行的容器/进程的完整命令? 我只能在此处看到“ nginx -g’daemon of”,而不是完整命令。 问题答案: 将显示完整命令以及正在运行的容器的其他详细信息。