将 Gitlab 秘密传递给 docker 在 CI 中构建
Pass Gitlab Secrets to docker build in CI
我目前正在寻找一种使用 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"}
我知道我可以只使用构建参数,但我有很多设置,我想避免将它们放在 CI
截至目前,在构建过程中没有直接从文件中读取的方法,但是您可以将所有参数添加到文件中,然后使用 bash 构建构建命令。
- 在Docker文件中你可以有以下内容:
# 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 .
有关更多详细信息,您可以查看 设置构建时变量 (--build-arg)
在 Docker 和 ARG usage in Dockerfile
您还需要考虑像 MAILER_URL
或 MAILER_PASSWORD
这样的变量,从安全的角度来看,您应该仅在部署时传递它们,并且还能够将您的图像部署到多个环境。
你可以看看The Twelve Factor App: Config section:
Env vars are easy to change between deploys without changing any code;
我目前正在寻找一种使用 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"}
我知道我可以只使用构建参数,但我有很多设置,我想避免将它们放在 CI
截至目前,在构建过程中没有直接从文件中读取的方法,但是您可以将所有参数添加到文件中,然后使用 bash 构建构建命令。
- 在Docker文件中你可以有以下内容:
# 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 .
有关更多详细信息,您可以查看 设置构建时变量 (--build-arg) 在 Docker 和 ARG usage in Dockerfile
您还需要考虑像 MAILER_URL
或 MAILER_PASSWORD
这样的变量,从安全的角度来看,您应该仅在部署时传递它们,并且还能够将您的图像部署到多个环境。
你可以看看The Twelve Factor App: Config section:
Env vars are easy to change between deploys without changing any code;