Docker 镜像名称自动更改

标签 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 }')

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

最佳答案

每个 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 标签 也可以做到这一点。 Docker Hub 和其他存储库上的镜像也可能发生变化(ubuntu:16.04 通常会通过安全更新重新发布),因此如果您docker pull 一个镜像,您已经拥有了它可能会导致旧图像“失去其名称”,取而代之的是该图像的新版本。

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

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

  • 如果图像是您自己构建的,那么在构建和运行图像时始终使用明确的版本标记(可以只是当前日期戳)。这样您就永远不会覆盖现有图像的标签。 (“不要使用 :latest 标签。”)

  • 使用 docker run --name 来跟踪哪个容器是哪个,并根据它而不是图像标签进行过滤。 (@quentino 来自评论的建议。)

  • 不要在您的工作流程中显式docker pull。如果您没有图像,docker run 会自动为您拉取它。这将避免现有图像进行较小的更新,也将避免现有图像丢失其名称。

关于Docker 镜像名称自动更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53580565/

相关文章:

docker - 是否可以重新创建或重新部署具有相同容器 ID 的 docker 容器?

docker - 由于错误 : "Error response from daemon: reference does not exist" 无法删除图像

bash - 在 Docker 容器启动时启动 bash 脚本不起作用

ruby-on-rails - 将时钟进程与Docker上的sidekiq worker分开

java - 每隔15分钟就会出现这个异常,查看fillInStackTrace信息

git - Bitbucket jenkin kubernetes CI/CD

logging - 应用日志.NET Core和Docker

linux - 容器内的 virt-install 命令

Docker Swarm - 跨主机部署具有共享代码库的堆栈

java - 您如何与部署为弹性 beanstalk 上的工作人员的 docker 容器共享特权信息?