Docker映像名称自动更改

时间:2018-12-02 13:11:48

标签: docker docker-container

我在主机(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 }')

它不起作用,因为图像名称已经更改

1 个答案:

答案 0 :(得分:2)

每个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 rundocker ps相互作用? docker run可以记住图像开始时使用的图像标签,但是如果该图像不再具有该标签,它将忘记该基准。因此,您的docker ps输出恢复为显示图像的十六进制ID。

针对您的应用程序,有两种解决方法:

  • 如果图像是您自己构建的,则在构建和运行图像时,请始终使用显式的版本标签(可能只是当前的日期戳)。这样,您将永远不会覆盖现有图像的标签。 (“不要使用:latest标签。”)

  • 使用docker run --name跟踪哪个容器是哪个容器,并基于该容器而不是图像标签进行过滤。 (@quentino在评论中的建议。)

  • 在工作流程中未明确docker pull。如果您没有图像,docker run将自动为您拉出图像。这样可以避免现有图像进行较小的更新,也可以避免现有图像丢失名称。