在 github 操作中拉取 dockerhub 镜像失败

问题描述 投票:0回答:1

我正在尝试使用 aws ec2 实例托管节点应用程序。我正在使用 Docker hub,这样我就可以使用 GitHub 来推送更改。我在 Docker hub 中创建了一个免费帐户并创建了一个存储库。并在 .github/workflows 中创建了一个 CICD.yml 文件。 yml 文件看起来像这样

name: Deploy Node Application

on: 
  push:
    branches:
      - mern-ec2-docker

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Source
        uses: actions/checkout@v4
      - name: Login to docker hub
        run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build Docker Image
        run: docker build -t ziendocker/zien-backend  .
      - name: Publish Image to docker hub
        run: docker push ziendocker/zien-backend:latest 
 
  deploy:
    needs: build
    runs-on: self-hosted 
    steps:
      - name: Pull image from docker hub
        run: docker pull ziendocker/zien-backend 
      - name: Delete old container
        run: docker rm -f nodejs-app-container  
      - name: Run Docker Container
        run: docker run -d -p 4000:4000 --name nodejs-app-container -e MONGO_PASSWORD='${{ secrets.MONGO_PASSWORD }}' ziendocker/zien-backend

创建的 Dockerfile 看起来像这样

FROM node:alpine3.18
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
EXPOSE 5000
CMD [ "npm","run","start"]

构建作业成功运行,登录成功,镜像已推送到 Docker hub。但是,当在从 docker hub 拉取镜像中运行部署作业时,会导致错误

运行 docker pull ziendocker/zien-backend

docker pull ziendocker/zien-backend 外壳:/usr/bin/bash -e {0} 使用默认标签:最新 来自守护进程的错误响应:ziendocker/zien-backend 的拉取访问被拒绝,存储库不存在或可能需要“docker 登录”:被拒绝:请求的资源访问被拒绝 错误:进程已完成,退出代码为 1。

由于镜像已经发布到 docker hub,访问凭证是正确的。我哪里出错了?

我尝试了

docker pull ziendocker/zien-backend:latest
导致了同样的错误。将初始登录更改为

- name: Login to Docker Hub
  uses: docker/login-action@v3
  with:
    username: ${{ secrets.DOCKERHUB_USERNAME }}
    password: ${{ secrets.DOCKERHUB_TOKEN }}

结果是

Run docker/login-action@v3
  with:
    password: ***
    ecr: auto
    logout: true
Error: Username and password required

尝试了来自 docker 的新访问令牌。部署时出现同样的错误

node.js yaml github-actions dockerhub docker-pull
1个回答
0
投票

说明

两种方法都应该有效,但是您使用两个不同的秘密变量名称(

DOCKER_USERNAME
vs
DOCKERHUB_USERNAME
)。哪一个是正确的,您确定它们配置为
secrets
而不是
variables

        run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }}
    username: ${{ secrets.DOCKERHUB_USERNAME }}

无论如何,真正的问题在这里:

  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Source
        uses: actions/checkout@v4
      - name: Login to docker hub
        run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }}
     ...
  deploy:
    needs: build
    runs-on: self-hosted
    steps:
      - name: Pull image from docker hub
        run: docker pull ziendocker/zien-backend
    ...

您有两项不同的工作,第一项负责推动,另一项负责拉动。首先,登录在作业之间不会持续。跑步者也不会,每项工作都会产生一个新的工作。无论如何,这并不适用于此,因为您的跑步者无论如何配置都不同。

如果您首先登录台式机并希望接下来在全新的笔记本电脑上进行拉取操作,情况也是一样的。

解决方案

因此,您需要做的就是将登录名也添加到第二个作业中:

    steps:
      - name: Login to docker hub
        run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Pull image from docker hub
        run: docker pull ziendocker/zien-backend 
      ...

只要这样做就应该起作用。

© www.soinside.com 2019 - 2024. All rights reserved.