Docker映像名称将自动更改

Docker映像名称将自动更改,docker,docker-container,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 POR

我在主机(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
在一周内,我再次运行了
sudocker ps
,它显示了图像更改的另一个信息,看起来像是ba2486f19dc0

我不明白为什么

这对我来说是个问题,因为对于停止容器,我使用以下命令:

sudo docker stop $(sudo docker ps | awk '{ print $1,$2 }' | grep gitname/reponame |  awk '{print $1 }')

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

每个Docker图像都有一个唯一的十六进制ID。这些ID在不同的系统上会有所不同(即使是同一图像的
Docker pull
),但每个图像都只有一个ID

每个图像都有一些与之关联的标记。这可以是零,也可以是多个<代码>docker标签将向现有图像添加标签
docker rmi
将删除标记,并且(如果图像上没有其他标记,没有使用图像作为基础的其他图像,也没有使用图像的现有容器)删除图像

可以从现有图像中“窃取”标签。最明显的方法是使用
docker build

cat>Dockerfile.txt
docker build-t foo。
docker图像
#注意,旧ID将显示为foo:
#请注意,foo:latest的ID不同
显式的
docker标记也可以做到这一点。Docker Hub和其他存储库中的图像也会发生变化(
ubuntu:16.04
通常会通过安全更新重新发布),因此,如果你
Docker拉取一个图像,你已经拥有它,它可能会导致旧图像“失去它的名称”,转而使用该图像的更新版本

这是如何与
docker run
docker ps
交互的
docker run
可以记住图像开始时使用的图像标记,但如果图像不再具有该标记,则会忘记该数据。这就是为什么您的
docker ps
输出恢复为显示图像的十六进制ID

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

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

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

  • 不要在您的工作流中显式地
    docker pull
    。如果您没有图像,
    docker run
    将自动为您提取图像。这将避免现有图像获得次要更新,也将避免现有图像丢失其名称


与此同时,你是否运行了另一个更新图像标签的
docker build
docker pull
?@DavidMaze没有,我刚刚从docker hub执行了docker pull并运行了它,还可以从docker Hub运行另一个构建。您可以向容器中添加名称:
sudo docker run-d-p 5050:80——命名我的应用程序gitname/reponame
,然后使用
docker stop my_app
docker start my_app
@quentino它会更改名称,但不会更改图像