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

9

我一直在设置 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

在我的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

所有变量都没有传递。我已经尝试过使用$variable_name和${variable_name},但都没有成功。我做错了什么?

1个回答

9
在Dockerfile的ENV指令中使用美元符号替代并不会扩展为调用docker build命令的主机上的环境变量,而是被Docker ARG值所取代。您可以通过使用--build-arg ARG_NAME=ARG_VALUE命令行参数将其传递到docker build命令,并将ENV指令中的ARG_NAME值替换为$ARG_NAME以达到替换为ARG_VALUE的目的。
参见: https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg 引用:

您可以在Dockerfile中使用ENV指令定义变量值。这些值在构建镜像后持久存在。但通常持久性不是您想要的。用户希望根据在哪个主机上构建映像来不同地指定变量。 一个很好的例子是http_proxy或用于拉取中间文件的源版本。ARG指令允许Dockerfile作者定义用户可以使用--build-arg标志在构建时设置的值。

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


5
不建议使用编译时变量传递机密信息,因为使用编译时变量的值可以通过docker history命令被镜像中的任何用户看到。 Docker参考文档 - Larry
我尝试了所有的方法,但都不起作用。请问有人可以帮忙吗? - Bharadwaj Giridhar
1
编辑:我终于找到了答案,那就是首先使用 --build-args 传递它,然后设置 ARG 和 ENV,最后确保通过运行 RUN $FOO=BAR Yarn BUILD 来传递它。示例代码片段:https://dev59.com/ElMH5IYBdhLWcg3wzi96#71372749 - Bharadwaj Giridhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接