我相信每个人都遇到过这样的情况:有人提交了糟糕的代码,你试图部署你的docker容器,它却一直在重启。今天我又遇到了这个问题,我试着在应用服务器上解决它。我使用以下命令启动了有问题的镜像:
sudo docker run -it --entrypoint /bin/sh (image name) -s
这使我可以输入图像,进行适当的更改,并启动应用程序。我想通过退出容器并运行
sudo docker commit (container id) (tag)
它将允许我保存更改并使用我的部署管道部署更新后的容器。然而,容器却一直在重新启动!我注意到在为有问题的容器运行sudo docker ps时显示的“命令”显示了/bin/sh -s,这是我用来修复有问题的容器的入口点。
所以我的问题是--我该如何处理这种情况?是否可以直接输入重新启动的映像,或者按照我尝试的过程进行操作?如果是这样,我如何正确地提交它,同时保留docker命令来启动应用程序?谢谢!
发布于 2020-05-14 09:21:51
处理这种情况的最好方法是为图像的每个版本提供一个唯一的标记。日期戳或源代码控制提交ID在这里都可以很好地工作。假设您使用的是日期戳:
sudo docker run -d -p ... my/image:20200513
# oops, that crashes然后就很容易运行昨天的构建了:
# we know this version works
sudo docker run -d -p ... my/image:20200512如果您使用的是源代码控制ID,则需要运行cvs/git/hg/svn log来查找以前的提交ID,但相同的基本技术也适用
sudo docker run -d -p ... my/image:0a1b2c3如果您的CI系统没有构建带标记的映像,您至少可以在源代码控制中返回到昨天的版本并运行:
git log
git checkout 0a1b2c3
sudo docker build -t my/image .
sudo docker run -d -p ... my/image或者,使用像git revert这样的命令来添加一个新的提交来撤消错误的更改:
git log
git revert 4d5e6f7
git push
# wait for the CI system to do its thing
sudo docker pull my/image
sudo docker run -d -p ... my/image您不应尝试直接编辑容器中的代码或使用docker commit。这可能会修复您的系统实例,但潜在的错误仍将存在于提交的代码中,其他任何人都不会从您的修复中受益。如果您在生产系统上执行此操作,则您的生产系统将运行未经过常规代码审查和测试过程的代码,并且与您的官方代码存储库不匹配。
发布于 2020-05-14 09:27:21
docker commit将运行的容器保存到新的标记中,因此我们可以继续检查它以进行调试。因此,docker commit还保存了您在手动运行容器时所做的入口点更改。
理想情况下,您应该在Dockerfile中更新您的更改/修复,并使用更新的标记构建一个新映像,这样您的入口点将与Dockerfile中提到的相同。
docker commit documentation also mentions to use Dockerfile as right way to manage changes.
https://stackoverflow.com/questions/61787224
复制相似问题