首页 > 解决方案 > 如何使用来自 GitHub Packages 的 Docker 镜像?

问题描述

我在.github/workflows/main.yaml有这段代码

# .github/workflows/main.yaml
name: CI Workflow

on: [push]

jobs:
  rspec-job:
    runs-on: ubuntu-latest
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    container:
      image: I-stucked-here
      volumes:
        - /vendor/bundle
    steps:
      - code omitted for brevity

这项工作的主要思想是在容器模式下运行所有​​步骤。不在 Linux 主机模式下。

在同一个存储库下,我有一个名为ruby​​-rimy-2.6.3的公共 Docker 映像。由于它不是在 DockerHub 上公开托管的,因此我找不到以编程方式向 GitHub Packages/Registry 验证自己的方法。

我确实尝试了不同的语法(见下面的代码),但没有奏效。

# .github/workflows/main.yaml
name: CI Workflow

on: [push]

jobs:
  rspec-job:
    runs-on: ubuntu-latest
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    container:
      image: docker://docker.pkg.github.com/zulhfreelancer/rimy/ruby-rimy-2.6.3:latest
      volumes:
        - /vendor/bundle
    steps:
      - code omitted for brevity

从文档中,GitHub 说GITHUB_TOKEN在作业运行时可用。如何使用此环境变量在该部分顶部 GITHUB_TOKEN运行类似的东西,以便作业能够提取图像?docker logincontainer:

使用 GitHub Personal Token 对我来说不是一个选项,因为在将相同的东西应用到我的 GitHub 组织之前,该存储库只是我的实验存储库。我不想将我的个人令牌放在我组织的存储库环境变量/秘密下——这只会将我的个人令牌暴露给我的同事。

标签: dockergithub-actions

解决方案


您不需要使用该container指令在容器中运行测试。

GitHub Actions 主机安装了 docker 和 docker-compose。我这样做的方式是docker-compose.yml在我的存储库中有一个,其中包括一个运行测试的“服务”。然后,您的工作流程需要执行docker login并简单地运行docker-compose run test命令。

请注意,这种方法的美妙之处在于,您的测试在您自己的机器和 CI 机器上执行完全相同。完全相同的步骤。

这些方面的东西:

name: Test
on:
  pull_request:
  push: { branches: master }

jobs:
  test:
    name: Run test suite
    runs-on: ubuntu-latest
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Docker login
      run: echo ${GITHUB_TOKEN} | docker login -u ${GITHUB_ACTOR} --password-stdin docker.pkg.github.com

    - name: Build docker images
      run: docker-compose build

    - name: Run tests
      run: docker-compose run test

我在 DockerHub 上做同样的事情,非常轻松和成功。

当然,如果你不想使用 docker-compose,docker run ...在登录步骤正确登录后,你仍然可以使用任何正常的命令。

我不确定该docker login命令是否会按原样工作,请参阅这些以进行更深入的讨论:


推荐阅读