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

通过GitHub Actions部署Docker容器至Ubuntu服务器遇文件缺失错误

问题解析与解决方案

为什么docker-compose找不到镜像里的yml文件

docker-compose是运行在宿主机(你的Ubuntu服务器)上的工具,它读取的是宿主机本地文件系统里的配置文件,根本不会去读取Docker镜像内部的文件。镜像里的文件只有当容器启动后,才会存在于容器的内部文件系统中,和宿主机完全隔离,所以你即使把yml打包进镜像,docker-compose也没法直接调用。

解决步骤

方案1:把docker-compose.production.yml放在代码仓库中(推荐)

将配置文件和代码一起托管在GitHub仓库,部署时先把文件传到服务器对应路径:

在你的GitHub Actions工作流的部署job里,添加以下步骤(假设用ssh连接服务器):

  • 先确保服务器上的目标目录存在:
- name: Create target directory on server
  uses: appleboy/ssh-action@v1.0.3
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SERVER_SSH_KEY }}
    script: mkdir -p /home/***/
  • 然后把仓库里的docker-compose.production.yml传到服务器:
- name: Copy docker-compose file to server
  uses: appleboy/scp-action@v0.1.7
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SERVER_SSH_KEY }}
    source: "docker-compose.production.yml"
    target: "/home/***/"

完成以上步骤后再执行docker-compose命令,就能找到目标文件了。

方案2:从镜像中提取yml文件(不推荐)

如果一定要从镜像里获取yml,可以先临时启动容器,再把文件拷贝到宿主机:

- name: Extract yml from image
  uses: appleboy/ssh-action@v1.0.3
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SERVER_SSH_KEY }}
    script: |
      docker run --rm --name temp-container your-dockerhub-username/your-image:latest sleep 10
      docker cp temp-container:/path/to/docker-compose.production.yml /home/***/

注意替换your-dockerhub-username/your-image:latest为你的镜像全名,以及/path/to/docker-compose.production.yml为镜像内yml的实际存储路径。

补充说明

配置文件(比如docker-compose.yml)属于部署配置,最好和代码仓库一起维护,这样版本可控,修改后CI/CD能自动同步到服务器,比打包进镜像灵活得多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:33:14