在 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 值是否可用,echo
ing 如上一条评论所述。如果有效,那么您的代码应该正确导入它。如果不是,请尝试使用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_USERNAME
和TWINE_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 中设置环境变量