我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。

基本上,我想启动一个shell,这样我就可以检查容器的内容。

幸运的是,我创建了带有-it选项的容器!


当前回答

这并不是你所要求的,但是如果你想要的只是检查文件,你可以在一个停止的容器上使用docker export。

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

其他回答

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

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

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

下面是引导入口点:

#!/bin/bash
command_a

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

#!/bin/bash
command_b

并重新启动:

docker restart c

我的问题:

我用docker run <IMAGE_NAME>启动了一个容器 然后将一些文件添加到这个容器中 然后我关闭了容器,并尝试使用与上面相同的命令再次启动它。 但当我检查新文件时,它们不见了 当我运行docker ps -a时,我可以看到两个容器。 这意味着每次我运行docker run <IMAGE_NAME>命令时,都会创建新的映像

解决方案: 要在最初创建的容器上运行,请执行以下步骤

Docker ps获取你的容器的容器 docker容器start <CONTAINER_ID>启动现有容器 然后你可以从你离开的地方继续。例如:docker exec -它<CONTAINER_ID> /bin/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总是给人留下这样的印象,它是为一个爱好系统而创建的,它在这方面做得很好。 如果某事失败或不起作用,不要指望有专业的解决方案。

也就是说:Docker不仅不支持这些基本的管理任务,还试图阻止它们。

解决方案:

cd /var/lib/docker/overlay2/ 查找| grep someechangedfile #你现在可以在你的容器中看到一个十六进制编码的文件夹/diff中更改的文件 cd hexcoded-folder / diff 创建一个entrypoint.sh(如果存在,请确保备份一个现有的) Cat > entrypoint.sh #!/bin/bash 在((1));做睡眠1;完成; Ctrl + C Chmod +x入口点。sh 码头工人停止 码头工人开始

你现在有你的docker容器运行一个无限循环,而不是原来的入口,你可以执行bash到它,或做任何你需要的。 停止容器后,删除/重命名自定义入口点。

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

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