docker 如何传递从GitHub操作接收的环境变量

3lxsmp7m  于 2022-12-03  发布在  Docker
关注(0)|答案(4)|浏览(162)

在我的action.yml中我定义了一个输入:

name: 'test action'
author: Param Thakkar
description: 'test'

inputs: 
  test_var:
    description: 'A test variable'
    required: true

runs:
  using: 'docker'
  image: 'Dockerfile'

在我的工作流中,我通过了test_var:

name: CI

on: [push]

jobs:
  build:

runs-on: ubuntu-latest

steps:
  - name: Test the GH action
    uses: paramt/github-actions-playground@master
    with:
      test_var: "this is just a test"

因此,当工作流运行时,应该创建一个环境变量,对吗?但是当我运行这个简短的python脚本时:

import os

print(os.getenv('TEST_VAR'))
print("It works!")

exit(0)

它会打印:

None
It works!

我想我必须通过我的Dockerfile传递ENV变量...现在我的Dockerfile看起来像这样:

FROM python:latest

# Add files to the image
ADD entrypoint.py /entrypoint.py
ADD requirements.txt /requirements.txt

# Save ENV var in a temp file
RUN $TEST_VAR > /temp_var

# Install dependencies and make script executable
RUN pip install -r requirements.txt
RUN chmod +x entrypoint.py

RUN echo "temp var: "
RUN cat /temp_var

# Run script with the ENV var
ENTRYPOINT export TEST_VAR="$TEST_VAR"; /entrypoint.py

但是这个变量没有被回显,也没有被传递给Python脚本。我是不是遗漏了什么?当我试图将我的$TEMP_VAR设置为一个随机字符串时,它被is发送到Python脚本。这是我的一个错误还是GitHub操作没有按预期工作?
这里是the link to the test repo

cczfrluj

cczfrluj1#

我想你读错了环境变量名。GitHub操作会在输入变量名中添加INPUT_。所以请尝试以下操作:

print(os.getenv('INPUT_TEST_VAR'))

从文档中:
当您在工作流文件中为操作指定输入或使用默认输入值时,GitHub会为输入创建一个名为INPUT_的环境变量。创建的环境变量会将输入名称转换为大写字母,并将空格替换为_字符。
例如,如果工作流定义了numOctocats和octocatEyeColor输入,则操作代码可以使用INPUT_NUMOCTOCATS和INPUT_OCTOCATEYECOLOR环境变量读取输入的值。
https://help.github.com/en/articles/metadata-syntax-for-github-actions#inputs

0g0grzrc

0g0grzrc2#

有点晚了,但对于下一个,您还可以使用env字段:

name: CI

on: [push]

jobs:
  build:

runs-on: ubuntu-latest

steps:
  - name: Test the GH action
    uses: paramt/github-actions-playground@master
    env:
      test_var: "this is just a test"

在创建Docker和pass时将包含该前缀,但不使用前缀INPUT_

g2ieeal7

g2ieeal73#

通过在存储库的Settings -> Secrets中指定env变量,然后在工作流中调用它们,来对它们进行保密:
例如,假设一个工作流运行一个R脚本,然后运行一个Python脚本。首先,在.github/workflows/my_job.yml中,注意MY_VAR变量,它指向一个存储在${{ secrets.MY_VAR}}中的秘密。其余的是标准代码(在cron上运行,指定Ubuntu操作系统和Docker映像,定义工作流步骤)。

on:
  schedule:
    - cron:  '0 17 * * *'
jobs:
  my_job:
    name: my job
    env:
      MY_VAR: ${{ secrets.MY_VAR }}
    runs-on: ubuntu-18.04
    container:
     image: docker.io/my_username/my_image:my_tag
    steps:
      - name: checkout_repo
        uses: actions/checkout@v2
      - name: run some code
        run: bash ./src/run.sh

接下来,在组成工作流的脚本中,您可以像在本地一样访问上面的工作流文件中指定的env var。
例如,在存储库中,假设src/run.sh调用R脚本,然后调用Python脚本。
R中,访问env var并将其存储为对象:

my_var <- Sys.getenv("MY_VAR")

.
.
.

Python中,访问env var并存储为对象:

import os

my_var = os.getenv("MY_VAR")
.
.
.

请参阅docs here

vxf3dgd4

vxf3dgd44#

在我的例子中,没有一个答案起作用。下面是我如何解决它。

---
name: Build and Push Docker Image to AWS ECR
on:
  push:
    branches: [ master ]

env:
  FOO: '${{ secrets.FOO }}'

jobs:
  build-and-push:
    name: Build Project and Push to AWS ECR
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2
        
        ... 
        
      - name: Build and Push to AWS ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        run: |
          docker build --build-arg FOO=$FOO -t $ECR_REGISTRY/crew-charge-app:latest .
          docker push $ECR_REGISTRY/crew-charge-app:latest

我首先必须使用${{secrets.FOO}}从github secrets中获取FOO变量,然后使用docker build --build-arg FOO=$FOO --build-arg BAR=$BAR -t将其传递到docker文件中。
然后在Docker文件中,我必须声明ARG和ENV在任何时候都可用。

FROM node:14

ARG FOO=${FOO}

ENV FOO=${FOO}

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

COPY package.json /usr/src/app

RUN yarn install

COPY . /usr/src/app

RUN FOO=$FOO yarn build

EXPOSE 80

CMD ["yarn", "start" ]

重要的部分是RUN FOO=$FOOYarn构建,因为单独设置ENV不会将其传递到容器上。

相关问题