TL;DR 如果父映像位于私有注册表中,是否必须将私有 Docker URI 放在 Dockerfile FROM
命令中?
我认为这应该是一个容易回答的问题,但找不到一组好的 Google 关键字...
详情:
我有三个存储库,都是用单独的 CI 调用构建的;这些 CI 执行的顺序对于这个 DAG 是正确的(即,当孩子需要时,父图像将可用):
FROM
Repo 1 中构建的映像。这些经常变化。据我所知,如果您没有在 FROM
命令中指定 repo URI,docker 会假定您是从 DockerHub 拉取的。 这是正确的吗?
如果这些镜像存储在私有注册表中,私有注册表是否必须明确包含在子 Dockerfile 中? 还有其他方法吗?
答案 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