我对如何在 CI/CD 工作流程中安全地处理机密和变量有点困惑。
设置: 我将我的 Express 应用程序部署到我的 VPS,在 Docker 容器中运行它,并且我需要该容器中可用的变量。
目前我正在将它们写入 .env 文件并将该文件设置为 docker-compose.yml 中的 env_file,但这可能不是一种非常安全的方法,因为这样服务器上就会有一个 .env 文件纯文本秘密...有更好的方法(最佳实践)吗?
.env 文件也不会像这样创建。我必须在服务器上手动创建它,如果文件不存在,
echo
不会创建该文件吗?
- name: Execute remote deployment script
uses: appleboy/[email protected]
with:
HOST: ${{ secrets.HOST }}
USERNAME: ${{ secrets.USERNAME }}
PORT: ${{ secrets.PORT }}
KEY: ${{ secrets.SSH_KEY }}
script: |
# Change directory to the app folder
cd /usr/src/app/
# install dependencies
npm ci --omit=dev
# Stop and remove running containers
docker-compose -f docker-compose.prod.yml down
# Set environment variables stored in Github secrets
echo "VITE_API_URL=${{ secrets.VITE_API_URL }}" > .env
echo "DATABASE_URL=${{ secrets.DATABASE_URL }}" >> .env
echo "SECRET_KEY=${{ secrets.SECRET_KEY }}" >> .env
echo "REFRESH_SECRET_KEY=${{ secrets.REFRESH_SECRET_KEY }}" >> .env
# start container and detach
docker-compose -f docker-compose.prod.yml up -d
Docker 的 secret mounts 是在 GitHub Action Workflows 中保证机密安全的推荐方法:
# workflow.yaml (truncated)
- name: Build Docker container
uses: docker/build-push-action@v6
with:
context: .
tags: docker_username/docker_repo_name:version_tag
secrets: |
"SECRET_KEY=${{ secrets.SECRET_KEY }}"
使用 Docker Compose,您可以使用 环境变量设置秘密,如下所示:
# compose.yaml
services:
app:
build:
context: .
image: docker_username/docker_repo_name:version_tag
environment:
SECRET_KEY_FILE: /run/secrets/secret_key
secrets:
- secret_key
secrets:
secret_key:
environment: "SECRET_KEY"
并在工作流程中设置环境变量,如下所示:
# workflow.yaml (truncated)
- name: Build Docker Compose service images
env:
SECRET_KEY=${{ secrets.SECRET_KEY }}
run: docker compose build