将Gitlab Secrets传递给CI中的docker build

时间:2019-03-14 20:31:50

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

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

据我发现,如果我在build命令中未指定-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"}

我知道我可以只使用build args,但是我有很多设置,我想避免将它们放在CI中

1 个答案:

答案 0 :(得分: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

  

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