docker build构建镜像正常,docker-compose提示找不到/GO/src/main目录
解决Docker Compose构建时
stat /GO/src/main: no such file or directory的问题 嘿,从你描述的情况来看,单独用docker build能成功构建镜像,但Docker Compose一跑就报找不到/GO/src/main,这大概率是Compose的配置或者构建上下文出了问题——毕竟单独构建没问题,说明你的Dockerfile本身是能正常工作的。咱们一步步来排查解决:
1. 先确认Docker Compose的构建上下文
Docker Compose默认会把docker-compose.yml所在的目录当成构建上下文。如果你之前单独docker build是在项目根目录(就是存着Dockerfile和src文件夹的那个目录)执行的,但docker-compose.yml放在了子目录里,那构建时复制文件的路径就会出错,自然找不到目标文件。
- 最省心的办法是把
docker-compose.yml移到项目根目录,和Dockerfile、src文件夹同级 - 如果必须放在其他目录,就在Compose的
build字段里显式指定上下文路径,比如:version: "3.3" services: your-service-name: build: context: ../project-root # 指向包含Dockerfile和src的项目根目录 dockerfile: Dockerfile
2. 检查Compose服务配置里的路径冲突
错误提示的/GO/src/main和你Dockerfile里设置的/app完全不匹配,十有八九是Compose的服务配置里改了路径相关的设置:
- 看看是不是不小心设置了
working_dir: /GO/src?这会让容器启动时切换到这个不存在的目录,自然找不到你的main执行文件 - 有没有挂载本地volume到
/GO/src?如果本地对应目录里没有main文件,就会触发这个错误 - 再检查下
command字段,是不是误写了/GO/src/main作为启动命令,而不是Dockerfile里定义的/app/main
3. 适配iron/go:dev的默认GOPATH(可选优化)
虽然你单独构建没问题,但iron/go:dev的默认GOPATH是/GO,如果你的Go代码依赖GOPATH的目录结构,后续可能还会出问题。可以调整下Dockerfile让代码符合这个规范,彻底避免路径冲突:
修改后的Dockerfile:
FROM iron/go:dev # 按照GOPATH规范创建代码目录,把your-repo-name换成你的实际仓库名 RUN mkdir -p /GO/src/your-repo-name COPY src/main/main.go /GO/src/your-repo-name/. ENV SRC_DIR=/GO/src/your-repo-name ADD . $SRC_DIR RUN go get goji.io RUN go get gopkg.in/mgo.v2 RUN cd $SRC_DIR; go build -o main ENTRYPOINT ["/GO/src/your-repo-name/main"]
这样代码就放在了镜像默认的GOPATH路径下,和镜像的环境更匹配,能减少后续踩坑的可能。
4. 验证配置并重新构建
先把你的docker-compose.yml补全,然后用下面的命令验证配置语法没问题,再重新构建(加--no-cache可以避免之前的构建缓存干扰):
docker-compose config docker-compose build --no-cache
内容的提问来源于stack exchange,提问作者ChrisAdkin
相关产品推荐
相关产品推荐

