docker - 如何使用来自 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 login
container:
使用 GitHub Personal Token 对我来说不是一个选项,因为在将相同的东西应用到我的 GitHub 组织之前,该存储库只是我的实验存储库。我不想将我的个人令牌放在我组织的存储库环境变量/秘密下——这只会将我的个人令牌暴露给我的同事。
解决方案
您不需要使用该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
命令是否会按原样工作,请参阅这些以进行更深入的讨论:
推荐阅读
- python - 尝试将安全组添加到 EC2 实例时出错
- java - 然而,试图对对象列表进行排序:java: int cannot be dereferenced
- c++ - 哪些类型的 memory_order 应该用于具有 atomic_flag 的非阻塞行为?
- r - 在进行随机抽样时,您是否考虑了事件的不同概率?(在 R 中)
- nestjs - 如何在创建输入类型时使用联合,嵌套 graphql 模式中的突变,通过代码优先方法
- neo4j - neo4j 浏览器报告完全不切实际的运行时
- javascript - 如何在当前页面上保留最后一个关键帧上的导航栏元素的动画?
- typescript - 生成构建器函数类型接口的 Typescript 泛型
- spring-boot - 树莓派中的 Java Springboot 构建失败
- libreoffice - 如何以编程方式在 LibreOffice Calc 中触发 AutoFit / SetOptimalHeight?