Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修复继续重新启动的docker容器_Docker - Fatal编程技术网

修复继续重新启动的docker容器

修复继续重新启动的docker容器,docker,Docker,我相信每个人都会遇到这样的情况:有人提交了错误的代码,您尝试部署docker容器,而它只是不断地重新启动。今天我又遇到了这个问题,并试图在应用服务器上解决它。我使用以下命令启动了故障映像: sudo docker run-it--entrypoint/bin/sh(图像名称)-s 这使我可以输入图像,进行适当的更改,并启动应用程序。我从集装箱里出来,跑开了 sudo docker提交(容器id)(标记) 它允许我保存更改并使用部署管道部署更新的容器。但是,容器再次继续重新启动!我注意到,在运行有

我相信每个人都会遇到这样的情况:有人提交了错误的代码,您尝试部署docker容器,而它只是不断地重新启动。今天我又遇到了这个问题,并试图在应用服务器上解决它。我使用以下命令启动了故障映像:

sudo docker run-it--entrypoint/bin/sh(图像名称)-s

这使我可以输入图像,进行适当的更改,并启动应用程序。我从集装箱里出来,跑开了

sudo docker提交(容器id)(标记)

它允许我保存更改并使用部署管道部署更新的容器。但是,容器再次继续重新启动!我注意到,在运行有关容器的
sudo docker ps
时显示的“command”显示了
/bin/sh-s
,这是我用来修复故障容器的入口点


所以我的问题是-我应该如何处理这种情况?是否可以直接输入重新启动的映像,还是按照我尝试的过程进行操作?如果是这样,如何在保留docker命令以启动应用程序的同时正确提交它?谢谢

处理这种情况的最佳方法是为图像的每个版本提供一个唯一的标签。日期戳或源代码管理提交ID在这里都能很好地工作。假设您使用日期戳:

sudo docker run-d-p。。。我的/图像:20200513
#哎呀,崩溃了
然后,运行昨天的构建非常容易:

#我们知道这个版本有效
sudo docker run-d-p。。。我的/图像:20200512
如果您使用的是源代码管理ID,则需要运行
cvs
/
git
/
hg
/
svn
log
来查找以前的提交ID,但同样的基本技术也可以工作

sudo docker run-d-p。。。我的/图像:0a1b2c3
如果您的CI系统未生成带标记的映像,您至少可以在源代码管理中返回到昨天的版本并运行:

git日志
git签出0a1b2c3
sudo docker build-t我的/图像。
sudo docker run-d-p。。。我的/图像
或者,使用类似于
git revert
的方法添加一个新的提交,以撤消错误的更改:

git日志
git还原4d5e6f7
git推送
#等待CI系统完成它的工作
sudo docker拉我的/图像
sudo docker run-d-p。。。我的/图像

您不应尝试直接在容器中编辑代码或使用
docker commit
。这可能会修复您的系统实例,但潜在的错误仍将存在于提交的代码中,没有其他人会从您的修复中受益。如果您在生产系统上执行此操作,您的生产系统将运行未经过普通代码检查和测试过程的代码,并且与您的官方代码存储库不匹配。

docker commit将运行的容器保存到新标记中,因此我们可以出于调试目的再次检查它。因此,docker提交还保存了手动运行容器时所做的入口点更改

理想情况下,您应该更新Dockerfile中的更改/修复,并使用更新的标记构建一个新映像,这样您的入口点将与Dockerfile中提到的相同


感谢David Maze提供的信息。我们确实使用git标记形式的独特标记构建容器。我问这个问题是因为我在一个独特的环境中开发,这使得重建和重新部署非常耗时。我希望有一种简单的方法可以在容器中进行调整,然后使用新标签提交。不幸的是,这似乎破坏了我的entrypoint命令。