我应该在 docker-compose 中设置 docker 图片版本吗?

Should I Set docker image version in docker-compose?

假设我有 docker-compose.yml 用于添加 mongo 作为容器,在图像名称前面设置版本是好事还是让它默认为最新?

version: '3.8'
services:
  mongo:
    image: mongo:4.0
    ports:
      - "27017:27017"

其实在开发和生产环境中应用的利弊是什么?

image: mongo:4.0 VS image: mongo

我觉得把版本放在镜像名前面是个好事,可以更方便地管理它们,但要注意定期传递更新,以免出现漏洞。

像您所做的那样包含版本号是一种很好的做法。我通常会使用仅主要图像标签 (mongo:4) 或主要+次要标签 (mongo:4.4) 但不使用超级特定版本 (mongo:4.4.10) 除非你有自动化定期更新。

一般来说,Docker Hub 镜像会经常重建;但是,在给定的补丁行中,只有最新的版本才能获得补丁。假设 debian:focal 基础映像获得了安全更新。在撰写本文时,mongo 图像具有 44.44.4.10 标签,因此所有这些都得到了重建,但是 例如 4.4.9 不会。因此,使用过于具体的版本可能意味着您无法获得重要更新。

相反,使用 latest 意味着您不关心您拥有的是什么版本。您的问题提到 mongo:4.0mongo:latest 目前是 5.0.5 版本;该主要版本升级是否存在兼容性问题?

这里的关键规则是:

  1. 如果您已经有一些 image:tag 本地,启动容器将不会再次拉取它,即使它已在存储库中更新。
  2. mongo:4.4 这样的次要版本标签只要受支持就会继续获取更新,但您可能需要 docker-compose pull 才能获取更新。
  3. mongo:4.4.9 这样的补丁版本标签将在有更新的补丁版本时停止获取更新,即使您 docker pull mongo:4.4.9.
  4. 使用像 ...:latest 这样的浮动标签或次要版本标签可能意味着不同的系统会获得不同的映像构建,具体取决于它们在本地拥有的内容。 (您的同事可能 mongo:latest 与您不同;这在像 Kubernetes 这样的集群环境中是一个更大的问题。)