我有一个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
文件无处可见。即使在构建日志中,一切似乎都很好。
知道我缺少什么吗?
答案 0 :(得分:1)
如果要将文件包含在Docker映像中,则Dockerfile需要将该文件从上下文复制到正在构建的映像中。就是说,由于您的文件实际上是.env
,所以我认为将其包含在图像中是没有意义的。
使用来自GitLab的Docker executor时,每个作业都在一个新容器中运行。这意味着除非您的主机和实际运行器之间有卷映射,否则env文件将不会持久。
对于docker部署,我们通常的设置是将文件夹/opt/project
映射到运行器。部署作业将.env
写入此文件夹中。然后,容器将使用.env
文件。
作为旁注,您可以使用在GitLab的UI中设置的CI机密将机密添加到.env
文件中。如果出于某种原因您不想使用CI机密,则可以直接在服务器中手动设置环境文件。