我正在尝试使用 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 的新访问令牌。部署时出现同样的错误
两种方法都应该有效,但是您使用两个不同的秘密变量名称(
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
...
只要这样做就应该起作用。