我正在尝试构建多个 docker 镜像并将它们推送到我的 gitlab 容器注册表。
这很好用,当我像这样构建和推送它们时:
sys.getdefaultencoding()
但是当我尝试根据 Gitlabs Container Registry Naming Convention 更改 stages:
- build
docker-build-template:
# Use the official docker image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
variables:
OS_IDENTIFIER: "ubuntu-1604"
script:
- cp docker/base/ubuntu-1604.dockerfile Dockerfile
- docker build --pull -t "${OS_IDENTIFIER}-base${tag}" .
- echo $CI_REGISTRY_IMAGE
- docker push $CI_REGISTRY_IMAGE
命令时,管道每次都失败,因为它尝试访问不存在的注册表。这是我尝试过但都失败的命令列表。
docker push
上述所有(我尝试了更多组合)都会产生此错误:
- docker push ${CI_REGISTRY_IMAGE}/${OS_IDENTIFIER}-base${tag}
- docker push ${CI_REGISTRY}/$[CI_PROJECT_ROOT_NAMESPACE}/${CI_PROJECT_NAME}
- docker push ${CI_REGISTRY}/$[CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}
- docker push ${CI_REGISTRY}/<my-group>/<my-project>/<image>:latest
- docker push <registry.example.com>/<mynamespace>/<myproject>/<image>:latest
$ docker push <one-of-the-above>:latest
An image does not exist locally with the tag: <one-of-the-above>
The push refers to repository [<one-of-the-above>]
命令似乎只引用整个存储库,而不是我使用命名约定时的预期。我该如何解决这个问题?我做错了什么?
提前致谢
答案 0 :(得分:1)
您构建镜像所用的镜像 ID 必须与您推送的镜像 ID 匹配。目前您正在尝试推送您没有的 ID。因此,您需要在构建时使用完整的 id 标记您的图像,因此应该可以使用以下方法:
- docker build --pull -t ${CI_REGISTRY}/<my-group>/<my-project>/<image>:latest .
- docker push ${CI_REGISTRY}/<my-group>/<my-project>/<image>:latest
同样,这里的关键是构建时的 ID 必须与推送时的 ID 完全匹配。命名还需要与您的注册表权限兼容 - 但您应该能够弄清楚这一点。