假设我使用 FROM 命令创建了一个使用另一个镜像作为 baseImage 的 Dockerfile,那么如果在本地找不到该 baseImage,Docker build 将从存储库中提取该 baseImage。
现在假设我构建了自己的基础镜像,并希望将其作为其他镜像的基础。然后,我为基础镜像指定一个通用名称,例如 aCommonImageName。如果我忘记在本地构建基础镜像,那么使用我的基础镜像作为基础镜像的镜像将会从仓库中下载另一个同名的随机镜像,甚至可能是被盗用的镜像。
如果在本地机器映像中找不到 baseImage,我该如何限制 Dockerfile 中止构建过程?
Docker Content Trust 可以提供帮助
Docker 内容信任 (DCT) 提供了对发送至远程 Docker 镜像仓库和从远程 Docker 镜像仓库接收的数据使用数字签名的功能。这些签名允许在客户端或运行时验证特定镜像标签的完整性和发布者。
根据您的情况,您可以对本地构建的基础镜像进行签名
aCommonImageName
。如果从远程镜像仓库拉取的镜像aCommonImageName
没有有效签名,构建过程将中止。细节
看
您需要做几件事:
出口网络规则。不要让你的生产服务器(CI 也算生产服务器)连接到互联网上的任意服务器。控制出站流量可以防止大量攻击。
请勿滥用镜像的通用名称。
FROM
镜像应始终指向由您信任的人员控制的已知位置。对于您不想公开发布的镜像,您可以指向私有镜像仓库服务器,或者至少使用您控制的镜像仓库和组织名称来命名镜像。例如,如果您拥有company-x
Docker Hub 上的组织,则组织外部的任何人都不能推送company-x/base-image-y
,即使您从未推送过 ,也可以安全地使用该名称base-image-y
。更好的是,你应该将这些引用固定到 sha256 摘要中,并自动更新这些固定值。这样,即使存储库被盗,唯一用于基础镜像的镜像也是你预先批准的镜像。