如何创建并推送多服务Docker镜像至Docker Hub?
解决方案:Docker项目打包与Docker Hub推送问题
一、当前构建错误原因
你根目录的Dockerfile报错是因为:
COPY compose.yaml /game-app这行命令会把compose.yaml文件直接复制到容器根目录,命名为/game-app(而非/game-app目录下的文件)。- 后续
WORKDIR /game-app尝试把一个文件当作工作目录,自然会报错“not a directory”。
即使修复这个错误(比如先RUN mkdir -p /game-app再COPY compose.yaml /game-app/),这种方案也无法满足你的需求——因为这个镜像只包含compose.yaml,没有front和back的代码,朋友拉取后根本无法构建服务。
二、正确的项目打包与推送方案
你的核心需求是让朋友拉取后直接使用完整项目,正确的做法是分别构建前端、后端镜像并推送到Docker Hub,再通过修改后的compose.yaml启动所有服务。
步骤1:构建并推送前端/后端镜像
前端镜像构建与推送:
进入front目录,执行:docker build -t hramos13/game-front:latest . docker push hramos13/game-front:latest后端镜像构建与推送:
进入back目录,执行:docker build -t hramos13/game-back:latest . docker push hramos13/game-back:latest
步骤2:修改compose.yaml
将原来的build配置替换为已推送的镜像地址,同时移除本地代码挂载(镜像已包含完整代码,无需挂载本地目录):
version: "3" services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: games restart: always ports: - 3306:3306 volumes: # 若朋友需要初始化数据库,请确保他们将seed脚本放在本地./back/prisma/seed目录 - ./back/prisma/seed:/docker-entrypoint-initdb.d api: # 替换为你的后端镜像地址 image: hramos13/game-back:latest ports: - 3001:3001 depends_on: - db restart: always environment: DATABASE_URL: mysql://root:root@db:3306/games JWT_SECRET: 1234567899oiuywrifasdfdufbdsfldsv web: # 替换为你的前端镜像地址 image: hramos13/game-front:latest ports: - 3000:3000 depends_on: - api restart: always
步骤3:分享给朋友使用
把修改后的compose.yaml(以及数据库初始化用的seed脚本,若需要)分享给朋友,他们只需:
- 确保本地安装了Docker和Docker Compose。
- 将
compose.yaml和seed脚本放在对应目录(./back/prisma/seed)。 - 执行命令启动服务:
docker-compose up -d
三、关于根目录Dockerfile的说明
你使用FROM docker/compose:latest的思路是错误的:
- 这个镜像的作用是在容器内运行Docker Compose命令,但它依赖宿主机的Docker守护进程(需要挂载
/var/run/docker.sock),并非用来打包整个项目。 - 它无法将你的
front、back代码打包进去,朋友拉取后没有源码,根本无法构建服务。
内容的提问来源于stack exchange,提问作者Henrique Ramos
相关产品推荐
相关产品推荐

