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
相关产品推荐
相关产品推荐

