我目前正在寻找一种使用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中
答案 0 :(得分:1)
到目前为止,在构建过程中尚无直接读取文件的方法,但是您可以将所有参数添加到文件中,然后使用bash来构建构建命令。
# 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 Docker和ARG usage in Dockerfile
从安全的角度来看,您还需要考虑MAILER_URL
或MAILER_PASSWORD
之类的变量,您应仅在部署时将其传递,并应将映像部署到多个环境中。
您可以看看The Twelve Factor App: Config section:
环境变量很容易在部署之间进行更改,而无需更改任何代码;