GitLab CI 对 Docker 构建作业的无效参数

Posted

技术标签:

【中文标题】GitLab CI 对 Docker 构建作业的无效参数【英文标题】:GitLab CI invalid argument on job for Docker build 【发布时间】:2018-11-02 07:19:00 【问题描述】:

所以我正在尝试设置我的 Gitlab CI 以触发 git push 上的作业以构建和部署我的 Docker。这是我根据 Gitlab 文档 (Elixir yml) 中的示例使用的 .gitlab-ci.yml 文件。

stages:
  - build

build:
  before_script:
    - docker build -f Dockerfile.build -t ci-project-build-$CI_PROJECT_ID:$CI_BUILD_REF .
    - docker create
      -v /build/deps 
      -v /build/_build
      -v /build/rel
      -v /root/.cache/aceapp/
      --name build_data_$CI_PROJECT_ID_$CI_BUILD_REF busybox /bin/true
  tags:
    - docker
  stage: build
  script: 
    - docker run --volumes-from build_data_$CI_PROJECT_ID_$CI_BUILD_REF --rm -t ci-project-build-$CI_PROJECT_ID:$CI_BUILD_REF

推送到 GitLab 实例时的输出是这样的:

Running with gitlab-runner 10.7.2 (b5e03c94)
on my.host.rhel.runner 8f724ea7
Using Shell executor...
Running on my.host.local...
Fetching changes...
HEAD is now at 14351c4 Merge branch 'Development' into 'master'
From https://my.host.example/zalmosc/ace-app
   14351c4..9fa2d43  master     -> origin/master
Checking out 9fa2d435 as master...
Skipping Git submodules setup
$ # Auto DevOps variables and functions # collapsed multi-line command
$ setup_docker
$ build
Logging to GitLab Container Registry with CI credentials...
Login Succeeded

Building Dockerfile-based application...
invalid argument "/master:9fa2d4358e6c426b882e2251aa5a49880013614b" for t: Error parsing reference: "/master:9fa2d4358e6c426b882e2251aa5a49880013614b" is not a valid repository/tag: invalid reference format
See 'docker build --help'.
ERROR: Job failed: exit status 1

我了解 docker 标签无效(before_script: 真的是根据名称触发的吗?),我正在寻求有关 a) 解决方案 b) 如何了解有关 a 要求的更多信息基于默认设置构建 docker 的管道。我是否需要在本地标记我的 docker 映像,然后以某种方式将其添加到我的 git 提交中?

【问题讨论】:

【参考方案1】:

-t 是用来标记你的 Docker 镜像的。请参阅文档here。

标签的格式应该像name:version,而你给它的/master:9fa2d4358e6c426b882e2251aa5a49880013614b不是一个有效的标签。你可以尝试删除master之前的/

【讨论】:

那么 Gitlab CI 中 Docker 镜像的默认构建脚本没有正确执行 -t 实现?谢谢,我再看看。 确实如此。它与 Docker 无关,但与您在 gitlab.ci.yml 中传递给 Docker 命令的参数有关。这些都是错误的。随意提出更多问题,或接受我的回答,以便其他人也得到帮助:) 最有可能在.gitlab-ci.yml 文件中。 @Mornor 在哪里为 gitlab 的“auto devops”脚本编辑它?【参考方案2】:

你的标签不能以'/'开头:

$ docker build -f Dockerfile.build -t /master:9fa2d4358e6c426b882e2251aa5a49880013614b .
invalid argument "/master:9fa2d4358e6c426b882e2251aa5a49880013614b" for "-t, --tag" flag: invalid reference format
See 'docker build --help'.

# remove '/'
$ docker build -f Dockerfile.build -t master:9fa2d4358e6c426b882e2251aa5a49880013614b .
Sending build context to Docker daemon  3.584kB
Step 1/3 : FROM ubuntu:16.04
---> 14f60031763d
...

【讨论】:

【参考方案3】:

如果您不使用内置注册表,您可能需要将 CI_REGISTRY_IMAGE 值设置为某个值。似乎如果您不设置它,它将被设置为 /master 并导致此错误。您可以在 CI 设置页面中进行设置,或者在创建新管道时进行设置。例如 CI_REGISTRY_IMAGE gitlab.com/user/project

【讨论】:

以上是关于GitLab CI 对 Docker 构建作业的无效参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml

在 GitLab CI 包构建中缓存 gem

如何在gitlab-ci.yml中将文件从存储库复制到用于作业的docker容器中

使用 gitlab-ci 构建多个 Docker 镜像

Gitlab-CI:测试作业失败

gitlab ci:手动或仅在 master 时运行构建作业