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 .env,cp $DOTENV_STAGE $CI_BUILDS_DIR/.env但cp $DOTENV_STAGE $CI_PROJECT_DIR/.env没有一个有效。
所以我实际上不知道的部分是:我必须将文件放在哪里才能在构建过程中供 docker 使用?
谢谢
您应该避免将.env文件完全复制到容器中。而是在运行时从外部提供它。有一个专用的道具:env_file。
web:
env_file:
- .env
Run Code Online (Sandbox Code Playgroud)
您可以将.env文件本身的内容存储在GitLabs CI 后端的屏蔽变量中。然后将其转储.env到运行器中的文件并提供给 Docker compose 管道。
经过更多研究后,我偶然发现了 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。但我还没尝试过
| 归档时间: |
|
| 查看次数: |
9377 次 |
| 最近记录: |