将 Gitlab Secrets 传递给 CI 中的 docker build

Min*_*eaK 2 environment-variables docker gitlab-ci docker-build

我目前正在寻找一种使用 Gitlab Secrets 在 CI 中定义 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"}
Run Code Online (Sandbox Code Playgroud)

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

Mos*_*ein 5

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

  1. 在 Dockerfile 中你可以有以下内容:
# In Dockerfile
ARG MAILER_URL http://localhost
ENV MAILER_URL=${MAILER_URL}
Run Code Online (Sandbox Code Playgroud)

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

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

echo "MAILER_URL=$CI_MAILER_URL" >> arguments.txt
# echo other variables to arguments.txt
Run Code Online (Sandbox Code Playgroud)

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 .
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,您可以检查Docker 中的设置构建时变量 (--build-arg)Dockerfile 中的 ARG 使用情况


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

您可以查看十二因素应用程序:配置部分

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