【问题标题】:Pass Gitlab Secrets to docker build in CI将 Gitlab Secrets 传递给 CI 中的 docker build
【发布时间】:2019-08-05 21:03:22
【问题描述】:

我目前正在寻找一种在 CI 中使用 Gitlab Secrets 定义 ENV 变量的方法,以便在需要部署容器时在构建时覆盖默认值。

据我所知,如果我不在构建命令中指定-e,就没有这种方法。但是,这对于一定数量的参数来说不是很实用。

我当前的命令目前看起来像这样:

# In .gitlab-ci
docker build -t $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/production:${CI_COMMIT_REF_SLUG} -f .docker/production/Dockerfile .

# In Dockerfile
ENV MAILER_URL=${MAILER_URL:-"null://localhost"}

我知道我可以只使用构建参数,但我有很多设置,我想避免将它们放在 CI 中

【问题讨论】:

  • 我知道这并不能回答问题,但是 - 您确定需要在构建时传递这些参数吗?也许在没有秘密的情况下构建图像然后在运行容器时添加它们更有意义?例如 - MAILER_URL 在构建时真的有必要吗?
  • 其实是的,命令是在构建时执行的,需要在构建时指定。 MAILER_URL 只是一个例子。

标签: docker environment-variables gitlab-ci docker-build


【解决方案1】:

截至目前,在构建过程中没有直接从文件读取的方法,但是您可以将所有参数添加到文件中,然后使用 bash 构建构建命令。

  1. 在 Dockerfile 中,您可以拥有以下内容:
# In Dockerfile
ARG MAILER_URL http://localhost
ENV MAILER_URL=${MAILER_URL}

这意味着默认情况下MAILER_URL 的值为http://localhost,但您可以在构建期间使用--build-arg 覆盖它

2- 将 Gitlab CI 变量导出到文件,例如 before_script 中的 (arguments.txt) 或任何其他效果更好的部分:

echo "MAILER_URL=$CI_MAILER_URL" >> arguments.txt
# echo other variables to arguments.txt

3- 读取 arguments.txt 并将其保存在变量中,然后将其传递给 docker build

export BUILD_ARGS=$(for arg in $(cat arguments.txt); do echo "--build-arg $arg ";done | tr -d '\n');

docker build -t $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/production:${CI_COMMIT_REF_SLUG} $BUILD_ARGS -f .docker/production/Dockerfile .

更多详情可以查看Set build-time variables (--build-arg) in DockerARG usage in Dockerfile


此外,您还需要从安全角度考虑 MAILER_URLMAILER_PASSWORD 等变量,您应该在仅部署时传递它们,并且能够将映像部署到多个环境。

你可以看看The Twelve Factor App: Config section

环境变量很容易在部署之间更改而无需更改任何代码;

【讨论】:

  • 但我的问题是如何从命令行中删除它们并从 gitlab ci env 中提取它们
  • 我已经尝试过您的示例,但是,当我使用指定的 arg 运行构建时,我收到错误 Unsupported DSN scheme: <not set>,但 printenv 确实向我显示了正确的环境,知道吗?跨度>
  • 您试图传递的值是什么,以便我检查?可能这个值解析有问题
  • 是的,我的配置中有错字,很抱歉,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2021-11-11
  • 2015-02-10
  • 2019-08-18
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多