将变量从 Github Action 传递到 Docker 镜像构建

Ope*_*lex 9 dockerfile github-actions

我一直致力于设置 Github Actions 工作流程来构建 docker 映像。我需要将环境变量传递到图像中,以便我的 Django 项目能够正确运行。不幸的是,当我构建图像时,它没有收到变量的值。

我的工作流程文件的相关部分:

     - name: Build, tag, and push image to AWS ECR
    id: build-image
    env:
      ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
      IMAGE_TAG: ${{ github.sha }}
      aws_ses_access_key_id: ${{ secrets.AWS_SES_ACCESS_KEY_ID }}
      aws_ses_secret_access_key: ${{ secrets.AWS_SES_SECRET_ACCESS_KEY }}
      DATABASE_ENGINE: ${{ secrets.DATABASE_ENGINE }}
      db_host: ${{ secrets.DB_HOST }}
      db_password: ${{ secrets.DB_PASSWORD }}
      db_port: ${{ secrets.DB_PORT }}
      db_username: ${{ secrets.DB_USERNAME }}
      django_secret_key: ${{ secrets.DJANGO_SECRET_KEY }}
      fcm_server_key: ${{ secrets.FCM_SERVER_KEY }}
    run: |
      docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
      docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
      echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_ENV
Run Code Online (Sandbox Code Playgroud)

在我的 Dockerfile 中,我添加了以下内容:

ENV aws_ses_access_key_id=$aws_ses_access_key_id aws_ses_secret_access_key=$aws_ses_secret_access_key DATABASE_ENGINE=$DATABASE_ENGINE db_host=$db_host db_password=$db_password db_port=$db_port db_username=$db_username django_secret_key=$django_secret_key fcm_server_key=$fcm_server_key
Run Code Online (Sandbox Code Playgroud)

没有任何变量传递。我尝试使用 $variable_name 和 ${variable_name} 但没有成功。我究竟做错了什么?

Kai*_*ack 9

Using dollar substitution in the value of an ENV instruction in the Dockerfile does not expand to an environment variable of the host on which docker build is called, but instead is replaced with a Docker ARG value, that you can pass via the --build-arg ARG_NAME=ARG_VALUE command line argument to the docker build command and then you can replace the value of ARG_NAME as $ARG_NAME to ARG_VALUE in your ENV instruction.

\n

See: https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg

\n
\n

您可以在 Dockerfile 中使用 ENV 指令来定义变量值。这些值保留在构建的映像中。然而,很多时候坚持并不是你想要的。用户希望根据他们在哪个主机上构建映像来指定不同的变量。\n一个很好的例子是 http_proxy 或用于拉取中间文件的源版本。ARG 指令允许 Dockerfile 作者定义用户可以使用 --build-arg 标志在构建时设置的值

\n
\n
\n

该标志允许您传递构建时变量,这些变量像 Dockerfile 的 RUN 指令中的常规环境变量一样被访问。此外,这些值不会像 ENV 值一样保留在中间或最终图像中。您必须为每个构建参数添加 --build-arg。

\n
\n

  • 不建议使用构建时变量来传递机密。使用 docker History 命令,镜像的任何用户都可以看到构建时变量值。[Docker 参考](https://docs.docker.com/engine/reference/builder/#arg) (5认同)