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

