在Gitlab构建期间在Docker映像中创建文件

时间:2020-10-08 09:45:48

标签: docker gitlab gitlab-ci

我有一个Gitlab CI,它在其中构建Docker映像,将其推送到Gitlab注册表,然后在服务器上拉并启动它。

问题是我的应用程序需要一个.env文件。因为我不想提交该文件,所以我想在构建过程中创建它。但是我做不到。

这就是我已经尝试过的:

1-将所有不同的变量设置为Gitlab环境变量,并使用bash脚本使用存储在Gitlab中的文件创建.env文件

deploy_staging:
  stage: deploy
  before_script:
    - chmod +x ./scripts/setup_env.sh
    - ./scripts/setup_env.sh
#!/bin/bash

echo NEXT_PUBLIC_GOOGLE_MAP_API_KEY=$NEXT_PUBLIC_GOOGLE_MAP_API_KEY >> .env
echo NEXT_PUBLIC_APOLLO_BROWSER_URL=$NEXT_PUBLIC_APOLLO_BROWSER_URL >> .env
echo NEXT_PUBLIC_APOLLO_SERVER_URL=$NEXT_PUBLIC_APOLLO_SERVER_URL >> .env
echo NEXT_PUBLIC_APOLLO_PROD_URL=$NEXT_PUBLIC_APOLLO_PROD_URL >> .env

2-将整个.env作为文件变量存储在Gitlab上并直接复制

deploy_staging:
  stage: deploy
  before_script:
    - echo "$ENV_FILE" > ./.env

但是无论采用哪种解决方案,结果都是一样的:.env文件无处可见。即使在构建日志中,一切似乎都很好。

知道我缺少什么吗?

1 个答案:

答案 0 :(得分:1)

如果要将文件包含在Docker映像中,则Dockerfile需要将该文件从上下文复制到正在构建的映像中。就是说,由于您的文件实际上是.env,所以我认为将其包含在图像中是没有意义的。

使用来自GitLab的Docker executor时,每个作业都在一个新容器中运行。这意味着除非您的主机和实际运行器之间有卷映射,否则env文件将不会持久。

对于docker部署,我们通常的设置是将文件夹/opt/project映射到运行器。部署作业将.env写入此文件夹中。然后,容器将使用.env文件。

作为旁注,您可以使用在GitLab的UI中设置的CI机密将机密添加到.env文件中。如果出于某种原因您不想使用CI机密,则可以直接在服务器中手动设置环境文件。