docker - 将 Gitlab Secrets 传递给 CI 中的 docker build
问题描述
我目前正在寻找一种在 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
解决方案
到今天为止,在构建过程中没有直接从文件中读取的方法,但是您可以将所有参数添加到文件中,然后使用 bash 来构建构建命令。
- 在 Dockerfile 中,您可以拥有以下内容:
# In Dockerfile
ARG MAILER_URL http://localhost
ENV MAILER_URL=${MAILER_URL}
这意味着默认情况下的值为MAILER_URL
willhttp://localhost
但您可以在构建期间通过使用覆盖它--build-arg
2- 将 Gitlab CI 变量导出到文件,例如(arguments.txt)before_script
或任何其他效果更好的部分:
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 .
有关更多详细信息,您可以检查Docker 中的设置构建时变量 (--build-arg)和Dockerfile 中的 ARG 用法
此外,您还需要考虑诸如MAILER_URL
或MAILER_PASSWORD
从安全角度来看的变量,您应该在仅部署时传递它们,并且还能够将图像部署到多个环境。
您可以查看The Twelve Factor App: Config 部分:
环境变量很容易在部署之间更改,而无需更改任何代码;
推荐阅读
- babeljs - babel 插件有订单吗?为什么插件无法得到插件前执行的结果
- typescript - 打字稿:推断嵌套对象中的属性类型
- php - 目标类 [EmailController] 不存在
- user-interface - 丰富的 UI 图标动画是怎么做的?
- python - pandas 根据模式生成日期序列
- .net-core - 文件记录器工作但数据库记录器不工作 (log4net)
- javascript - Asset.loadAsync(moduleId) 在发布模式下在 Android 上抛出 `Error: resource id #0x0`
- c# - 使用 EF 6 和 C# 从相关表中检索数据
- react-native - 使用 gitlab 自动构建 React Native 应用程序
- javascript - 统计 MERN,react,nodejs