You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action构建的文件夹无法复制到Docker镜像,求排查解决

问题

无法将通过GitHub Action构建的产物文件夹复制到Docker镜像中,构建镜像时提示找不到public文件夹。相关配置如下:

GitHub Action 配置

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: bahmutov/npm-install@v1
      - run: yarn install
      - run: yarn workspace client build
      - run: bash collectclient.sh

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ctrlmaniac
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - name: Build and push
        uses: docker/build-push-action@v3
        with:
          push: true
          tags: ctrlmaniac/me:latest

collectclient.sh 脚本

#!/usr/bin/bash

echo "Removing old files"
rm -rf public

echo "Copying new files"
cp -r packages/client/build public

Dockerfile 配置

FROM golang:1.19.4-alpine3.17

WORKDIR /home

COPY main/main.go /home/main/main.go
COPY public/ /home/public

RUN go build -o /home/server main/main.go
RUN go install /home/server

CMD ["server"]
解决方法

问题根源是docker/build-push-action的默认行为:它默认会拉取GitHub仓库的原始代码作为Docker构建上下文,而你在工作流中生成的public文件夹是运行时创建的,不在仓库的Git提交记录里,所以构建时找不到这个文件夹。

只需要修改docker/build-push-action的配置,明确指定用当前工作目录(也就是工作流运行时生成了public文件夹的目录)作为构建上下文:

修改后的Build and push步骤如下:

- name: Build and push
  uses: docker/build-push-action@v3
  with:
    context: .
    push: true
    tags: ctrlmaniac/me:latest

另外可以加个验证步骤,在执行collectclient.sh后检查public是否生成,方便后续排查:

- run: ls -la public

最后别忘了检查项目根目录的.dockerignore文件,如果里面有忽略public的规则,必须删掉这条规则,否则Docker构建时还是会跳过这个文件夹。

内容的提问来源于stack exchange,提问作者ctrlmaniac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:40:39