使用 docker/build-push-action 和 GitHub Actions 的生产 ENV 文件

Dar*_*en. 7 environment-variables docker dockerhub dotenv github-actions

docker/build-push-action创建发布标签时,我的 GitHub 操作中会运行以下作业。

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      -
        name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      -
        name: Login to DockerHub
        uses: docker/login-action@v1 
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_TOKEN }}
      -
        name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: user/repo:latest
      -
        name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}
Run Code Online (Sandbox Code Playgroud)

在我的工作中Dockerfile,我有一项任务,需要完成.env.production并完成它.env

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

这显然失败了,因为 .env.Production 不包含在 Git 中。

我的问题是,如何在我的 GitHub 操作中发生类似的事情?我之前考虑过创建 env 文件,Build and push但我认为该任务是从 docker 容器中的 main 中提取的,所以实际上不会看到我创建的文件?或者如果有什么东西覆盖它。

实现这一目标的最佳方法是什么?

提前致谢

joe*_*los 2

这就是我想出来的。

Dockerfile

...
ARG ARG_ENV_SECRET
ARG ARG_ENV_SECRET_1
COPY ./env-script.sh ./
RUN ./env-script.sh
...
Run Code Online (Sandbox Code Playgroud)

env-script.sh 该脚本创建 .env 文件

#!/bin/sh

touch .env
{
  printf "ENV_SECRET=%sENV_SECRET_1=%s" "$ARG_ENV_SECRET" "ARG_ENV_SECRET_1"
} >> .env
Run Code Online (Sandbox Code Playgroud)

docker-action.yml

...

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Build, tag, and push the image to Amazon ECR
        id: build-image
        env:
          ENV_SECRET: ${{ secrets.ENV_SECRET }} #naming used below
          ENV_SECRET_1: ${{ secrets.ENV_SECRET_1 }}
        run: |
          docker \ 
           --build-arg ARG_ENV_SECRET=$ENV_SECRET #name declared above
           --build-arg ARG_ENV_SECRET_1=$ENV_SECRET_1
          build .
...
Run Code Online (Sandbox Code Playgroud)

我很确定这不是最好的路线,但它对我们来说很有效,因为我们使用第三方来运行我们的 AWS 服务。更好的方法是在启动实例时使用 AWS 密钥。你可以在这里读更多关于它的内容。