docker - Docker 镜像名称自动更改
问题描述
我在我的主机上运行了几个容器(Ubuntu 服务器)
我通过命令运行 docker 容器,如下所示
sudo docker run -d -p 5050:80 gitname/reponame
在我打电话后sudo docker ps
它显示
CONTAINER ID: e404ffa2bc6b
IMAGE: gitname/reponame
COMMAND: "dotnet run --server…"
CREATED: 14 seconds ago
STATUS: Up 12 seconds
PORTS: 5050/tcp, 0.0.0.0:5050->80/tcp
NAMES: reverent_mcnulty
一周后我sudo docker ps
再次运行,它显示了另一个信息,其中 IMAGE 已更改,看起来像 ba2486f19dc0
我不明白为什么。
这对我来说是个问题,因为为了停止容器,我使用以下命令:
sudo docker stop $(sudo docker ps | awk '{ print $1,$2 }' | grep gitname/reponame | awk '{print $1 }')
它不起作用,因为图像名称已经更改
解决方案
每个 Docker 镜像都有一个唯一的十六进制 ID。这些 ID 在不同的系统上会有所不同(即使docker pull
是同一图像),但每个图像都只有一个 ID。
每个图像都有一些与之关联的标签。这可以是无,也可以是多个。 docker tag
将标签添加到现有图像;docker rmi
将删除一个标签,并且(如果图像上没有其他标签,没有其他使用该图像作为基础的图像,并且没有使用该图像的现存容器)删除该图像。
可以从现有图像中“窃取”标签。最明显的方法是使用docker build
:
cat >Dockerfile <<EOF
FROM busybox
COPY file.txt /
EOF
echo foo > file.txt
docker build -t foo .
docker images
# note the ID for foo:latest
echo bar > file.txt
docker build -t foo .
docker images
# note the old ID will show as foo:<none>
# note a different ID for foo:latest
显式docker tag
也可以做到这一点。Docker Hub 和其他存储库上的映像也可以更改(ubuntu:16.04
通常会通过安全更新重新发布),因此,如果docker pull
您已经拥有一个映像,它可能会导致旧映像“失去其名称”,转而支持更新版本图片。
这如何与docker run
和相互作用docker ps
? docker run
可以记住图像开始时使用的图像标记,但如果图像不再具有该标记,则它会忘记该数据。这就是您的docker ps
输出恢复为显示图像的十六进制 ID 的原因。
对于您的应用程序,有几种方法可以解决此问题:
如果图像是您自己构建的图像,请在构建和运行图像时始终使用明确的版本标记(可能只是当前日期戳)。然后,您将永远不会覆盖现有图像的标签。(“不要使用
:latest
标签。”)用于
docker run --name
跟踪哪个容器是哪个容器,并基于该容器进行过滤,而不是图像标签。(@quentino 的评论建议。)不要
docker pull
在您的工作流程中明确显示。如果您没有图像,docker run
将自动为您拉取它。这将避免现有图像得到较小的更新,也将避免现有图像丢失其名称。
推荐阅读
- java - 使用泊松分布生成一个范围内的随机数
- laravel - Apache2 多个文件夹
- java - 动态创建许多对象后动画变得滞后
- c++ - 8 拼图代码。我的队列没有填充问题,我找不到我的错误的位置
- qt - QDir::rename 返回 false
- cucumber - 在大型代码库/团队中重用黄瓜步骤
- reactjs - 如何使用 Nav.Link 和 React Router 在导航栏中设置活动链接?
- laravel - Laravel 关系很慢
- intellij-idea - 在没有装订线的 Intellij 中添加条件断点
- javascript - Javascript将这个和其他参数传递给函数