GitHub Actions构建推送Docker镜像报错:Dockerfile不存在
解决GitHub Actions构建Docker镜像时“Dockerfile不存在”的错误
我尝试通过GitHub Actions将Docker镜像构建并推送到DockerHub,但遇到错误提示:Dockerfile does not exist in location Dockerfile,虽参考过相关解决方案仍未解决问题。
GitHub Actions配置代码
service: runs-on: ubuntu-latest defaults: run: working-directory: ./microservices/service strategy: matrix: node-version: [16.x] steps: - name: CHECK-OUT GIT REPOSITORY uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' cache-dependency-path: '**/package-lock.json' - name: INSTALL DEPENDENCIES run: npm ci - name: BUILDING APP run: npm run build --if-present #- name: TESTINT APP #- run: npm test - name: Build & push Docker image uses: mr-smithers-excellent/docker-build-push@v5 with: image: dockercountname/aos_movie_service tags: latest registry: docker.io dockerfile: Dockerfile username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}
本地目录结构
microservice_cicd(文件夹) microservices(文件夹) service1(文件夹) package.json Dockerfile ... service2(文件夹) package.json Dockerfile ...
Dockerfile内容
FROM node:latest RUN mkdir -p /src/app WORKDIR /src/app COPY package.json /src/app/package.json RUN npm install COPY . /src/app EXPOSE 3003 CMD [ "npm", "start" ]
问题分析与解决方案
核心问题
配置中defaults.run.working-directory设置为./microservices/service,但实际目录里只有service1和service2,路径不匹配导致找不到Dockerfile;另外,第三方构建action可能不会自动继承全局的工作目录配置,需要显式指定镜像构建的上下文和Dockerfile路径。
方案1:构建单个服务(以service1为例)
修改全局工作目录为实际服务路径,同时确保构建action指向正确的Dockerfile:
service: runs-on: ubuntu-latest defaults: run: working-directory: ./microservices/service1 # 修正为实际服务目录 strategy: matrix: node-version: [16.x] steps: # 前面步骤不变 - name: Build & push Docker image uses: mr-smithers-excellent/docker-build-push@v5 with: image: dockercountname/aos_movie_service tags: latest registry: docker.io dockerfile: Dockerfile # 此时工作目录已指向service1,直接写Dockerfile即可 context: ./microservices/service1 # 显式指定构建上下文,避免路径问题 username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}
方案2:批量构建多个服务
通过matrix遍历服务名称,动态设置工作目录和构建路径:
service: runs-on: ubuntu-latest strategy: matrix: node-version: [16.x] service-name: [service1, service2] # 遍历所有服务 steps: - name: CHECK-OUT GIT REPOSITORY uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' cache-dependency-path: microservices/${{ matrix.service-name }}/package-lock.json # 动态指定缓存路径 - name: INSTALL DEPENDENCIES run: npm ci working-directory: ./microservices/${{ matrix.service-name }} # 动态设置工作目录 - name: BUILDING APP run: npm run build --if-present working-directory: ./microservices/${{ matrix.service-name }} - name: Build & push Docker image uses: mr-smithers-excellent/docker-build-push@v5 with: image: dockercountname/aos_movie_${{ matrix.service-name }} # 镜像名称区分服务 tags: latest registry: docker.io dockerfile: microservices/${{ matrix.service-name }}/Dockerfile # 显式指定Dockerfile路径 context: microservices/${{ matrix.service-name }} # 显式指定构建上下文 username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}
内容的提问来源于stack exchange,提问作者Sodiki
相关产品推荐
相关产品推荐

