Docker 图片名称自动更改
Docker image name is changed automatically
我运行在我的主机(Ubuntu服务器)上安装了几个容器
I 运行 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
,它显示了另一个信息,其中图像已更改,看起来像 ba2486f19dc0
我不明白为什么。
这对我来说是个问题,因为我使用命令停止容器:
sudo docker stop $(sudo docker ps | awk '{ print , }' | grep gitname/reponame | awk '{print }')
并且它不起作用,因为图像名称已经更改
每个 Docker 图像都有一个唯一的十六进制 ID。这些 ID 在不同的系统上会有所不同(甚至 docker pull
相同的图像),但每个图像都有一个 ID。
每张图片都有一些与之关联的标签。这可能是 none,或多个。 docker tag
将为现有图像添加标签; docker rmi
将删除一个标签,并且(如果图像上没有其他标签,没有其他图像使用该图像作为基础,并且没有现存的容器使用该图像)删除图像。
可以 "steal" 来自现有图像的标签。最明显的方法是使用 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
已经拥有的图像可能会导致旧图像"lose its name" 支持该图像的更新版本。
这如何与 docker run
和 docker ps
交互? docker run
可以记住图像开始时使用的图像标签,但如果图像不再具有该标签,它就会忘记该数据。这就是为什么您的 docker ps
输出恢复为显示图像的十六进制 ID。
您的应用程序有几种解决方法:
如果图像是您自己构建的,那么在构建和 运行 图像时始终使用明确的版本标签(可以只是当前日期戳)。这样您就永远不会覆盖现有图像的标签。 ("Don't use :latest
tags.")
使用 docker run --name
来跟踪哪个容器是哪个,并根据它而不是图像标签进行过滤。 (@quentino 来自评论的建议。)
不要在您的工作流程中显式 docker pull
。如果您没有图片,docker run
会自动为您拉取。这将避免现有图像进行较小的更新,也将避免现有图像丢失其名称。
我运行在我的主机(Ubuntu服务器)上安装了几个容器
I 运行 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
,它显示了另一个信息,其中图像已更改,看起来像 ba2486f19dc0
我不明白为什么。
这对我来说是个问题,因为我使用命令停止容器:
sudo docker stop $(sudo docker ps | awk '{ print , }' | grep gitname/reponame | awk '{print }')
并且它不起作用,因为图像名称已经更改
每个 Docker 图像都有一个唯一的十六进制 ID。这些 ID 在不同的系统上会有所不同(甚至 docker pull
相同的图像),但每个图像都有一个 ID。
每张图片都有一些与之关联的标签。这可能是 none,或多个。 docker tag
将为现有图像添加标签; docker rmi
将删除一个标签,并且(如果图像上没有其他标签,没有其他图像使用该图像作为基础,并且没有现存的容器使用该图像)删除图像。
可以 "steal" 来自现有图像的标签。最明显的方法是使用 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
已经拥有的图像可能会导致旧图像"lose its name" 支持该图像的更新版本。
这如何与 docker run
和 docker ps
交互? docker run
可以记住图像开始时使用的图像标签,但如果图像不再具有该标签,它就会忘记该数据。这就是为什么您的 docker ps
输出恢复为显示图像的十六进制 ID。
您的应用程序有几种解决方法:
如果图像是您自己构建的,那么在构建和 运行 图像时始终使用明确的版本标签(可以只是当前日期戳)。这样您就永远不会覆盖现有图像的标签。 ("Don't use
:latest
tags.")使用
docker run --name
来跟踪哪个容器是哪个,并根据它而不是图像标签进行过滤。 (@quentino 来自评论的建议。)不要在您的工作流程中显式
docker pull
。如果您没有图片,docker run
会自动为您拉取。这将避免现有图像进行较小的更新,也将避免现有图像丢失其名称。