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

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

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


当前回答

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

我解决问题的方法是:

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

其他回答

我把@Dmitriusan的回答变成了一个别名:

别名docker-run- prer -container='prev_container_id="$(docker ps -aq | head -n1)"&& docker commit "$prev_container_id" && docker run -it——entrypoint=bash "prev_container/$prev_container_id"

将此添加到~/中。Bashrc别名文件,你会有一个漂亮的新docker-run- prec -container别名,它会把你放到前一个容器的shell中。

有助于调试失败的docker构建。

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

我解决问题的方法是:

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

对我来说,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到它,或做任何你需要的。 停止容器后,删除/重命名自定义入口点。

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

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

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

下面是引导入口点:

#!/bin/bash
command_a

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

#!/bin/bash
command_b

并重新启动:

docker restart c

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

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