在 Gitlab CI 中构建期间将 .env-File 添加到 Docker-Image 的最佳实践

Dan*_*iel 5 continuous-integration environment-variables gitlab docker kubernetes

我有一个 node.js 项目,我在不同的环境(本地、阶段、生产)中作为 Docker 容器运行,因此通过.env-Files 配置它。正如我一直建议的那样,我不会将.env-Files 存储在我的远程存储库(即 Gitlab)中。我的生产和阶段系统作为 kubernetes 集群运行。

我想要实现的是通过 Gitlab 的 CI 针对不同环境(例如阶段)进行自动构建,具体取决于提交分支(也称为阶段),这意味着当我推送到 origin/stage 时,我希望为其构建 Docker 映像我的舞台环境及其.env中相应的文件。

在我的本地计算机上,这非常简单,因为我的.env应用程序的根文件夹中有所有不同的文件,我只是在我的应用程序中使用它Dockerfile

COPY .env-stage ./.env
Run Code Online (Sandbox Code Playgroud)

一切都很好。

由于我没有将 .env-Files 存储在远程存储库中,因此这种方法不起作用,因此我使用了 Gitlab CI 变量,并使用本地文件的内容创建了一个名为DOTENV_STAGEof type 的变量。file.env-stage

现在我的问题是:如何将该内容作为 .env-File 获取到将由 gitlab 构建的 docker 映像中,因为该文件还不是我的存储库中的文件,而是一个变量?

我尝试使用cp(见下文,也在before_script-section 中)在构建过程中将文件复制到 -File .env,但这显然不起作用。

我当前的构建阶段如下所示:

image: docker:git

services:
  - docker:dind

build stage:
  only:
    - stage
  stage: build
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - cp $DOTENV_STAGE .env
    - docker pull $GITLAB_IMAGE_PATH-$CI_COMMIT_BRANCH || true
    - docker build --cache-from $GITLAB_IMAGE_PATH/$CI_COMMIT_BRANCH --file=Dockerfile-$CI_COMMIT_BRANCH -t $GITLAB_IMAGE_PATH/$CI_COMMIT_BRANCH:$CI_COMMIT_SHORT_SHA .
    - docker push $GITLAB_IMAGE_PATH/$CI_COMMIT_BRANCH
Run Code Online (Sandbox Code Playgroud)

这导致

 Step 12/14 : COPY .env ./.env
 COPY failed: stat /var/lib/docker/tmp/docker-builder513570233/.env: no such file or directory
Run Code Online (Sandbox Code Playgroud)

我也尝试过cp $DOTENV_STAGE .envcp $DOTENV_STAGE $CI_BUILDS_DIR/.envcp $DOTENV_STAGE $CI_PROJECT_DIR/.env没有一个有效。

所以我实际上不知道的部分是:我必须将文件放在哪里才能在构建过程中供 docker 使用?

谢谢

jay*_*rjo 7

您应该避免将.env文件完全复制到容器中。而是在运行时从外部提供它。有一个专用的道具:env_file

web:
  env_file:
    - .env
Run Code Online (Sandbox Code Playgroud)

您可以将.env文件本身的内容存储在GitLabs CI 后端的屏蔽变量中。然后将其转储.env到运行器中的文件并提供给 Docker compose 管道。


Dan*_*iel 4

经过更多研究后,我偶然发现了 gitlab.com 上的一个支持论坛条目,它准确地描述了我的情况(不幸的是它同时被删除了),并且通过我尝试使用的相同方法解决了这个问题,即:

...
script:
- cp $DOTENV_STAGE $CI_PROJECT_DIR/.env
...
Run Code Online (Sandbox Code Playgroud)

在我的 .gitlab-ci.yml 中

我实际上缺少的部分是.dockerignore相应地调整我的 -File (.env从中删除),然后删除该行

COPY .env ./.env
Run Code Online (Sandbox Code Playgroud)

从我的Dockerfile

在Joyarjo 的回答之后我想到的另一种方法可能是使用Kubernetes 的 ConfigMap。但我还没尝试过