Github Actions: 在同一Docker中运行多个作业

3
我正在学习如何使用GitHub Actions来运行多个Docker任务,以下是我目前的进展:
GitHub Actions的YML文件如下所示。其中有两个任务:job0使用Dockerfile0构建Docker,job1使用Dockerfile1构建Docker。
# .github/workflows/main.yml
name: docker CI

on: push

jobs:
  job0:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build and Run
      run: docker build . --file Dockerfile0 --tag job0

  job1:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build and Run
      run: docker build . --file Dockerfile1 --tag job1

"Dockerfile0和Dockerfile1基本上具有相同的内容,除了最后一行中的参数不同:"
FROM ubuntu:20.04

ADD . /docker_ci
RUN apt-get update -y
RUN apt-get install -y ... ...

WORKDIR /docker_ci
RUN python3 script.py <arg>

我想知道,我能否为第一个工作构建一个Docker,并在从第一个工作构建的Docker中调用多个作业执行命令?这样我就不必保留多个Dockerfile并节省一些Docker构建时间。
最好是从Dockerfile在本地构建我的Docker,因此我希望避免使用来自docker hub的容器。 runs-for-docker-actions 看起来相关,但我很难找到本地部署操作的示例(无需发布)。

你可以创建自己的 Github 容器操作,并且可以选择性地输入参数。基本上,你需要一个 action.yml 文件和一个 Dockerfile(你已经有了这个)。你可以使用 uses: ./ 或类似的方式运行它,并使用 with 来指定你的参数。 - astrochun
1个回答

4

从您提供的细节来看,似乎您不应该构建两个不同的镜像 - 无论是为了CI还是本地开发目的(如果这很重要)。

据此,我会考虑以下方法:

  1. 定义一个Dockerfile,并使用一个最基本的ENTRYPOINT作为您的需求的最低公共分母(可以是bashpython script.py)。
  2. 在GitHub Actions中,有一个单一的作业,其中包含多个步骤 - 一个用于构建镜像,其他步骤用于带参数运行它。

例如:

FROM ubuntu

RUN apt-get update && apt-get install -y python3

WORKDIR /app
COPY script.py .

ENTRYPOINT ["python3", "script.py"]

这个 Dockerfile 可以被执行,并且可以使用任何参数,这些参数将会被传递到 script.py 入口点:

$ docker run --rm -it imagename some arguments

一份 GitHub Actions 的示例配置可能如下所示:

jobs:
  jobname:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build the image
      run: docker build --tag job .
    - name: Test 1
      run: docker run --rm -it job arg1
    - name: Test 2
      run: docker run --rm -it job arg2

如果你坚持要将这些分为不同的任务,就我所了解的,最简单的选择仍然是重新构建镜像(但仍使用单个 Dockerfile),因为共享在一个作业中构建的 docker 镜像到另一个作业中将是一个更加复杂的任务,我建议尽量避免。

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