使用私有注册表创建 Docker 映像层次结构

时间:2021-03-25 20:28:14

标签: docker dockerfile docker-registry

TL;DR 如果父映像位于私有注册表中,是否必须将私有 Docker URI 放在 Dockerfile FROM 命令中?

我认为这应该是一个容易回答的问题,但找不到一组好的 Google 关键字...

详情:

我有三个存储库,都是用单独的 CI 调用构建的;这些 CI 执行的顺序对于这个 DAG 是正确的(即,当孩子需要时,父图像将可用):

  • Repo 1 包含一个 Dockerfile,用于构建具有依赖项的基础映像。进展缓慢
  • Repo 2 & 3 保存在 Dockerfile 中构建的应用程序,该 Dockerfile 会拉取 FROM Repo 1 中构建的映像。这些经常变化。

据我所知,如果您没有在 FROM 命令中指定 repo URI,docker 会假定您是从 DockerHub 拉取的。 这是正确的吗?

如果这些镜像存储在私有注册表中,私有注册表是否必须明确包含在子 Dockerfile 中? 还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

Docker 在您的本地存储库中查找镜像名称,如果在那里找不到镜像,它将从 docker hub 中拉取。

一开始,直觉上我们应该能够将私有存储库配置为默认值,然后像使用 docker hub 一样使用它。 不过,这似乎是一个冗长的讨论话题,您可以关注讨论here

不幸的是,在撰写本文时,要从私有存储库构建,您需要在 Dockerfile 中指定完整的 URI:

FROM <aws_account_id>.dkr.ecr.<aws region>.amazonaws.com/<private image name>:latest

您需要将 Docker 守护程序配置为 authenticate 并从您的私有 ECR 存储库中提取:

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

然后去

docker build .

或者,您可以使用参数来构建您的 ECR URI。这将使您的 Dockerfile 中的内容保持干净和参数化,同时明确您正在使用私有存储库。 例如: 在您的Dockerfile

ARG PRIVATE_REPO
FROM ${PRIVATE_REPO}your_image_name

并使用以下命令构建 docker 镜像:

docker build . --build-arg PRIVATE_REPO=aws_account_id.dkr.ecr.region.amazonaws.com/

答案 1 :(得分:0)

您的基本假设是正确的:如果您的基础镜像位于私有注册表中,您通常必须在下游 Dockerfiles 的 FROM 行、docker run 命令、Compose 和 Kubernetes {{1} }} 行,等等。如果图像名称的注册表部分不存在,则默认为 image:

docker.io

这仅在本地机器上不存在图像时才真正重要,在这种情况下,Docker 会自动拉取它。如果它已经存在,Docker 不会担心它来自哪里,而只是按原样使用它。如果您有一个手动的多阶段构建,但实际上并没有将任何中间阶段推送到任何地方,那么您是否为任何特定存储库标记它实际上并不重要。

# Expands to docker.io/library/alpine:latest
FROM alpine
# "step 2" Dockerfile
# Build with: `docker build -t step2 -f step2.Dockerfile .`
# Starts from image in internal repository
FROM registry.example.com/img/step1