如何在GitHub Actions中使用Docker?

102
当我创建GitHub Actions工作流文件时,示例YAML文件包含runs-on: ubuntu-latest。根据文档,我只能在几个Ubuntu版本、Windows Server和macOS X之间进行选择。
我原本认为GitHub Actions在Docker中运行。那么我如何选择我的Docker镜像呢?
2个回答

120

GitHub Actions会提供一个虚拟机 - 就如您所说的,可以是Ubuntu、Windows或macOS - 并在其中运行您的工作流。然后,您可以使用该虚拟机来在容器内运行工作流。

使用 container 指示符 在容器内运行步骤。请确保将runs-on指定为适用于您容器的主机环境(对于Linux容器,请使用ubuntu-latest,对于Windows容器,请使用windows-latest)。例如:

jobs:
  vm:
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo This job does not specify a container.
          echo It runs directly on the virtual machine.
        name: Run on VM
  container:
    runs-on: ubuntu-latest
    container: node:10.16-jessie
    steps:
      - run: |
          echo This job does specify a container.
          echo It runs in the container instead of the VM.
        name: Run in container

1
@FlorianWilhelm 作者已经更正了语法,现在可以正常工作。 - kubanczyk
如果container是GH注册表中的私有镜像,这个方法还能行得通吗? - TayTay
6
有没有一种方法可以缓存容器镜像,以便在每次触发作业时不需要从 Docker Hub 下载? - josecm
从技术上讲,这是同一份工作,只是有两个不同的操作。 - kraggle

57
作为工作流的一部分,一个任务在虚拟机内运行。您可以选择他们提供的环境之一(例如ubuntu-latestwindows-2019)。
一个任务由一个或多个步骤组成。一个步骤可能是一个简单的shell命令,使用run。但它也可能是一个操作,使用uses
name: CI

on: [push]

jobs:
  myjob:
    runs-on: ubuntu-18.04 # linux required if you want to use docker
    steps:
    # Those steps are executed directly on the VM
    - run: ls /
    - run: echo $HOME
    - name: Add a file
      run: touch $HOME/stuff.txt
    # Those steps are actions, which may run inside a container
    - uses: actions/checkout@v1
    - uses: ./.github/actions/my-action
    - uses: docker://continuumio/anaconda3:2019.07
  • run: <COMMAND> 执行带有操作系统shell的命令
  • uses: actions/checkout@v1 运行来自用户/组织actions在存储库checkout中的操作(https://github.com/actions/checkout),主要版本1
  • uses: ./.github/actions/my-action 运行定义在您自己的存储库中此路径下的操作
  • uses: docker://continuumio/anaconda3:2019.07 运行来自用户/组织continuumio,版本2019.07anaconda3镜像,来自Docker Hub(https://hub.docker.com/r/continuumio/anaconda3)

请注意,如果您想使用Docker,则需要选择Linux发行版作为环境。

查看usesrun文档以获取更多详细信息。

需要注意的是,还有一个container选项,允许您将通常在主机上运行的任何步骤运行在容器内:https://help.github.com/en/articles/workflow-syntax-for-github-actions#jobsjob_idcontainer

1
针对你最后的问题,我无法在容器中正确执行我的“run”命令,甚至无法运行echo“hello world”。容器刚启动就会停止运行,然后作业失败并出现错误响应:Error response from daemon: Container 60e7cf...0b17 is not running。您知道为什么会出现这种情况/如何解决吗?我使用的镜像是python:3.7-alpine。 - Arne
2
@Arne 不,不是立刻就要这样做。可能只是他们那边的一个错误。但我认为这有点超出了这个问题的范围,你应该打开一个新的问题并发布你的workflow.yml。 - soerface
使用docker://方案和uses关键字,我如何指定运行配置? - undefined

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