将Gitlab机密传递给docker build in CI

将Gitlab机密传递给docker build in CI,docker,environment-variables,gitlab-ci,docker-build,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}

我目前正在寻找一种使用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中,因为到目前为止,在构建过程中没有直接的方法读取文件,但是您可以将所有参数添加到文件中,然后使用bash来构造build命令

在Dockerfile中,您可以拥有以下内容: 这意味着默认情况下,MAILER_URL的值为http://localhost 但是您可以在构建期间使用-build arg覆盖它

2-将Gitlab CI变量导出到before_脚本中的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 .
有关更多详细信息,请查看和

还需要从安全的角度考虑像MeleRayURL或MeleRyPosil这样的变量,在部署时应该传递它们,也可以将图像部署到多个环境。

你可以看看:

Env-vars很容易在部署之间进行更改,而无需更改任何代码


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

在Dockerfile中,您可以拥有以下内容: 这意味着默认情况下,MAILER_URL的值为http://localhost 但是您可以在构建期间使用-build arg覆盖它

2-将Gitlab CI变量导出到before_脚本中的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 .
有关更多详细信息,请查看和

还需要从安全的角度考虑像MeleRayURL或MeleRyPosil这样的变量,在部署时应该传递它们,也可以将图像部署到多个环境。

你可以看看:

Env-vars很容易在部署之间进行更改,而无需更改任何代码


但我的问题是如何从命令行中删除它们,并从gitlab ci envI'vre中提取它们。我尝试了您的示例,但是,当我使用指定的参数运行build时,我收到错误:不支持DSN scheme:,但printenv确实向我显示了正确的env,知道吗?您试图传递的值是什么,以便我可以检查?使用此值进行解析可能有问题是的,我的配置中有一个输入错误,对此表示抱歉,感谢您的帮助!但我的问题是如何从命令行中删除它们,并从gitlab ci envI'vre中提取它们。我尝试了您的示例,但是,当我使用指定的参数运行build时,我收到错误:不支持DSN scheme:,但printenv确实向我显示了正确的env,知道吗?您试图传递的值是什么,以便我可以检查?使用此值进行解析可能有问题是的,我的配置中有一个输入错误,对此表示抱歉,感谢您的帮助!我知道这不能回答这个问题,但是-您确定需要在构建时传递这些参数吗?也许构建没有秘密的图像,然后在运行容器时添加它们更有意义?例如-MAILER_URL在构建时真的有必要吗?实际上是的,命令在构建时执行,并要求在构建时指定它。MAILER_URL只是一个例子。我知道这并不能回答问题,但是-您确定需要在构建时传递这些参数吗?也许构建没有秘密的图像,然后在运行容器时添加它们更有意义?例如-MAILER_URL在构建时真的有必要吗?实际上是的,命令在构建时执行,并要求在构建时指定它。MAILER_URL只是一个例子。