在 GitLab CI/CD 作业中将环境变量传递给 docker run 返回无效的参考格式?

Posted

技术标签:

【中文标题】在 GitLab CI/CD 作业中将环境变量传递给 docker run 返回无效的参考格式?【英文标题】:Passing environment variables to docker run in GitLab CI/CD job returning invalid reference format? 【发布时间】:2020-03-21 05:14:28 【问题描述】:

我在工作日志中收到以下错误消息:

217 $ docker run -e TWINE_USERNAME \  # collapsed multi-line command
218 docker: invalid reference format.
219 See 'docker run --help'.
223 ERROR: Job failed: exit code 125

完整日志可在https://gitlab.com/oxr463/buildbot_tyrian_theme/-/jobs/360851515#L217获取。

.gitlab-ci.yml工作如下:

pypi:
  type: deploy
  variables:
    TWINE_USERNAME: $TWINE_USERNAME
    TWINE_PASSWORD: $TWINE_PASSWORD
  before_script:
    - |
         docker run -v $(pwd):/opt/buildbot_tyrian_theme \
                    $CI_REGISTRY/oxr463/buildbot_tyrian_theme \
                    python setup.py bdist_wheel sdist --formats gztar
  script:
    - |
         docker run -e TWINE_USERNAME \ 
                    -e TWINE_PASSWORD \
                    -v $(pwd):/opt/buildbot_tyrian_theme \
                    $CI_REGISTRY/oxr463/buildbot_tyrian_theme twine upload dist/*
  only:
    - tags

来源:https://gitlab.com/oxr463/buildbot_tyrian_theme/blob/master/.gitlab-ci.yml

这仅在通过 GitLab CI/CD 运行时发生;如果在本地运行,该命令可以正常工作。

更新:

script 命令不是多行字符串,而是我将它折叠成单行并且它起作用了。但是,我仍然想弄清楚为什么它通过了 GitLab CI/CD linter 却无法正常工作。

参考资料:

Docker Docs: docker run - Set environment variables (-e, --env, --env-file) GitLab Docs: Passing environment variables to services

另见:

https://***.com/a/30494145/8507637

【问题讨论】:

您是否在此 repo 的 CI 设置中设置了这些变量?也许您必须从​​ .gitlab-ci.yml 中删除两个变量声明。 是的,它们是在设置 > CI/CD > 变量下定义的。我将尝试为我的下一个构建删除这些声明。 不,那也失败了,(参见:gitlab.com/oxr463/buildbot_tyrian_theme/-/jobs/360998617)。 【参考方案1】:

注意:我尝试第二个答案,以免与另一个答案混淆。

从注册表 URI 中删除架构

昨天我收到了类似的错误消息,在我的案例中,隐秘的问题是具有私有注册表 URI 值的 env 指定了一个方案 https://,而 Docker 则使用泛型抱怨它

参考格式无效。

我花了半个下午的时间挖掘它,以为问题出在其他地方..?

试一试:echo "$CI_REGISTRY" 并确保您的 $CI_REGISTRY 中没有架构。如果它在那里,请将其删除。 Docker 会自动添加。

如果它解决了您的问题,请告诉我们! ??

【讨论】:

CI_REGISTRY 是一个预定义变量,(参见:docs.gitlab.com/ee/ci/variables/predefined_variables.html)。它可以被覆盖,但我不确定我是否应该这样做...... 是的,你不应该。但是检查其中存储的值是什么。我可能错了,但昨天我的问题得到解决,确保它不包含 URL 架构。获取带有所有扩展值的命令,您可以检查是否复制/粘贴到本地 shell 中是否会出现相同的 invalid reference format 错误。据我了解, reference 是图像标记到注册表存储库的完整 URI;所以那里可能有问题(在我的具体情况下,这是不必要的 https:// 架构)。【参考方案2】:

docker run 命令在 shell 中执行(正如你从开头的$ 看到的那样);因此 TWINE_USERNAME 被解释为字符串而不是环境变量。

命令应该是:

$ docker run -e "$TWINE_USERNAME" \ # collapsed multi-line command

这样 env-var 值将被扩展为您的命令。

编辑:我错过了-e 选项并给出了错误的答案。我可以再给一些建议。

试试这两个:

    确保变量设置正确并且在script 中可用。
script:
    - echo "TWINE_USERNAME is set to '$TWINE_USERNAME'"
    - |
         docker run -e TWINE_USERNAME ....
    尝试使用-e/--env 作为设置器而不是代理。明确设定其价值,从周围环境中获取价值
docker run -e TWINE_USERNAME="$TWINE_USERNAME"

这个选项的使用应该更安全。老实说,我不是 100% 确定仅指定名称就可以代理该值;我没有这方面的经验。

但请先尝试明确设置,并确保问题不在其他地方。

【讨论】:

希望对您有所帮助! – 我在 GitlabCI/CD 中迈出了第一步,所以我可能错了。 – 提示: 当某些事情没有按预期工作时,我通常会添加一个带有 echo <command-that-needs-debugging> 的初始 before_script 条目,然后将输出日志检查到 Gitlab 作业中,以确保每个变量都得到正确扩展(也它可以很容易地在本地 shell 中复制和粘贴以验证语法是否正确)。 我的错,我没有检查 -e 标志的含义(导入/代理特定的环境)。 – 首先检查 env 值是否可用,echoing 如上一条评论所述。如果有效,那么您的代码应该正确导入它。如果不是,请尝试使用docker run -e TWINE_USERNAME="$TWINE_USERNAME" 明确指定值——顺便说一句,在gitlab-ci.yml 中,我还将其定义为TWINE_USERNAME: "$TWINE_USERNAME" 以避免出现空格问题。 抱歉给我弄得一团糟?;我更新了这个答案和added another one 一个与环境变量的通过无关的解决方案。【参考方案3】:

服务是在评估其他脚本之前创建的,所以我要声明全局变量:

#top of .gitlab-ci.yml
variables:

尝试在脚本块中回显TWINE_USERNAMETWINE_PASSWORD 以验证它们的值。

【讨论】:

这并没有解决问题,(参见:gitlab.com/oxr463/buildbot_tyrian_theme/pipelines/98958866)。

以上是关于在 GitLab CI/CD 作业中将环境变量传递给 docker run 返回无效的参考格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml

如何正确设置环境变量 Gitlab CI/CD 和 Docker

带有 maven 的 gitlab CI/CD 不会在 application.properties 中设置环境变量

如何在 GitLab CI 的管道中将变量的值从一个作业传递到下一个作业?

Gitlab CI/CD 自动标记发布

GitLab CI/CD中的常用预设变量