如何在 Github Actions 中使用私有 Docker 镜像

31

我正在尝试在Github Actions中设置一个作业,以运行一个私有的docker镜像。我将使用容器选项在该docker镜像内进行构建。链接.

我使用以下代码:

jobs:
  container1:
    runs-on: ubuntu-latest
    container: saeed/privateimage:1
    steps:
      - uses: actions/checkout@v2
      - run: |
          echo "Runs inside a container"

但是我不能提供我的Docker Hub凭证,所以它失败了。

我应该如何进行身份验证以拉取那个私有镜像呢?

谢谢。

3个回答

34
对于那些试图在你的工作或步骤中使用发布到新的GitHub Docker容器注册表(ghcr.io)的自定义 Docker镜像的人,以下是我所做的步骤。

步骤

  1. 在GitHub文档上创建一个个人访问令牌,参见new Docker Container Registry。要做到这一点,请转到您的GitHub Account > Settings > Developer Settings > Personal Access Tokens,并为您的令牌选择以下选项:

    Creating a New Personal Access Token

  2. 转到您项目的GitHub存储库,进入Settings > Secrets > New Secret并创建一个类似这样的秘密: Adding a secret containing your personal access token to your repository
  3. 将该令牌放入计算机环境中,如下所示(或者只需复制它,以适合您的情况):
  4. export DOCKER_CONTAINER_REGISTRY_TOKEN=<the personal access token>
    
  5. 将Docker镜像推送到ghcr.io/<YOUR_USERNAME>/<IMAGE_NAME>:<IMAGE_TAG>。要做到这一点,您可以在Pushing Docker Images to the GitHub Docker Container Registry的文档中找到相关信息。简而言之,在计算机上可以执行以下操作:
  6. # 登录到ghcr.io
    echo $DOCKER_CONTAINER_REGISTRY_TOKEN | docker login ghcr.io -u <YOUR_USERNAME> --password-stdin
    # 作为示例,这里我拉取一个镜像,为其打标签,并推送它。
    docker pull ubuntu:18.04
    docker tag ubuntu:18.04 ghcr.io/<YOUR_USERNAME>/my_special_ubuntu:latest
    docker push ghcr.io/<YOUR_USERNAME>/my_special_ubuntu:latest
    
  7. 然后,在您的存储库中的.github/workflows/文件夹下创建一个操作。在此示例中,我们将其命名为super-action
  8. # 您可以在任何编辑器中创建该文件。
    # 以下命令可以完成这个工作...
    cd $YOUR_PROJECT_PATH/.github/workflows
    touch super-action.yml
    
  9. 打开super-action.yml操作,可以执行以下操作:
  10. # 操作名称
    name: Super Action
    
    # 在这里,该操作将在所有推送事件上启用。
    # 根据您的需求进行修改。
    on:
        push
    
    # 工作部分
    jobs:
        # 将使用刚刚推送到ghcr.io的容器镜像的工作
        super-job:
            runs-on: ubuntu-18.04
            container:
                image: ghcr.io/<YOUR_USERNAME>/<IMAGE_NAME>:<IMAGE_TAG>
                credentials:
                   username: <YOUR_USERNAME>
                   password: ${{  secrets.DOCKER_CONTAINER_REGISTRY_TOKEN }}
            steps:
                - name: super-step
                  shell: bash
                  run: |
                    # 在这里使用位于ghcr.io上的您的新Docker镜像的容器运行任何命令!
                    echo "--This is running in my custom Docker image--"
    
    

结果

在你将某些内容推送到仓库后,你应该能够在你的操作中看到类似于这样的运行情况。在下面的截图中,我使用了自己的 Docker 镜像 在这里找到 和我的自定义 super-action

Docker image is pulled in the GitHub action

然后,您可以看到您的工作的run命令在使用该Docker镜像的容器内执行! 在使用ghcr.io上的Docker镜像的容器内执行命令的工作

我注意到的一件事是,如果你在Github的主文件夹(/github/home)中复制文件,在容器启动后它们将被全部清除。 - ant1g

23

看起来支持刚刚在今天加入了,参见博客文章

该文章使用以下示例:

jobs:
  build:
    container:
      image: octocat/ci-image:latest
      credentials:
        username: mona
        password: ${{ secrets.docker_hub_password}}
    services:
      db:
        image:  octocat/testdb:latest
        credentials:
          username: mona
          password: ${{ secrets.docker_hub_password }}

container 的文档在这里


1
是的,我也注意到了。合法的。 - masseyb
1
请注意,当 actions-runner 在容器内运行时,不支持 container 功能 (Error: Container feature is not supported when runner is already running inside container.)。我仍然必须使用 语法。在 Kubernetes 中运行自托管的 Runner。 - masseyb

8
更新:请查看@Benjamin W.答案。GitHub Actions 新增对工作流和服务容器中私有注册表的支持

文档指出,jobs.<job_id>.container.image应该是一个公共可用的镜像:

“要用作操作运行容器的 Docker 镜像。值可以是 Docker Hub 镜像名称或公共 Docker 注册表名称。”

您可以为访问私有的 docker 注册表配置凭据作为secrets,然后使用这些 secrets 登录并运行您的私有镜像,例如:

  test:
    name: test
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2

      - name: example.com docker registry login
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login example.com -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

      - name: run backend tests using example.com/my-image
        run: |
          docker run --rm -i \
            -v ${PWD}:/workspace/source \
            -e PYTHONPATH=/workspace/source \
            -e DJANGO_SETTINGS_MODULE="www.settings" \
            -w /workspace/source \
            --entrypoint tox \
            example.com/my-image

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