我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
我想用一个不同的命令来启动一个停止的Docker容器,因为默认命令会崩溃——这意味着我不能启动容器,然后使用' Docker exec'。
基本上,我想启动一个shell,这样我就可以检查容器的内容。
幸运的是,我创建了带有-it选项的容器!
当前回答
在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脚本以重新运行它。
其他回答
——entrypoint /bin/bash cont_id_or_name
(对于conven,把你的env, vol挂载在docker-compose.yml)
或者使用docker运行并手动指定所有参数
编辑这个文件(对应于你停止的容器):
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)。
在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容器,覆盖现有的入口点脚本。
这并不是你所要求的,但是如果你想要的只是检查文件,你可以在一个停止的容器上使用docker export。
mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR