Dockerfile中go get执行后go build提示找不到包的问题解决
解决Docker+Go构建时依赖包找不到的问题
嘿,我之前也踩过几乎一模一样的Docker+Go挂载坑!咱们来一步步拆解问题、找到根源并解决它。
问题还原
你在Dockerfile里用RUN go get预安装了Go依赖,但通过docker-compose up构建启动容器后,执行go build却提示找不到依赖包;手动在容器里再跑一遍go get,构建就正常了——这个现象其实藏着一个很典型的挂载覆盖问题。
问题根源
从你贴的目录对比能一眼看出来:
- Docker构建阶段(
RUN go get)会把依赖的源码同步到容器的/go/src/github.com/...目录下 - 但你在docker-compose里把本地的
./src直接挂载到了容器的/go/src!这会直接覆盖容器里原本已经存在的/go/src目录结构,包括刚下载的依赖源码目录 - 手动执行
go get时,依赖是被下载到了被挂载的本地./src目录里,所以此时go build能找到包,但这显然不是我们想要的预构建依赖的方式
解决方案
第一步:调整Dockerfile,给项目创建独立目录
我们需要把项目代码和全局依赖的目录隔离开,避免挂载时覆盖依赖:
FROM golang:latest RUN apt-get update RUN apt-get upgrade -y ENV GOBIN /go/bin RUN go get github.com/go-sql-driver/mysql # 创建项目专属目录,和全局依赖目录区分开 RUN mkdir /go/src/explorer-cli
第二步:修改docker-compose的挂载配置
只把本地的项目源码挂载到容器内的专属目录,而不是整个/go/src:
version: '3.4' services: mysql: image: mysql:latest container_name: database volumes: - ./docker/:/etc/mysql/conf.d - ./docker/:/docker-entrypoint-initdb.d environment: - MYSQL_RANDOM_ROOT_PASSWORD=true - MYSQL_DATABASE=explorer - MYSQL_USER=XUSER - MYSQL_PASSWORD=XXXX app: build: . tty: true image: explorer-cli:latest container_name: explorer-cli volumes: # 仅挂载本地项目目录到容器内的专属目录,不影响全局依赖 - ./src/explorer-cli:/go/src/explorer-cli external_links: - database
第三步:调整构建命令
最后执行构建时,指定项目专属目录下的main.go即可:
go build -i -o /go/bin/explorer-cli src/explorer-cli/main.go
这样调整后,Docker构建阶段下载的依赖会稳稳待在/go/src/github.com/下,不会被本地挂载的目录覆盖,go build就能正常找到依赖包了,不用再手动执行go get啦!
内容的提问来源于stack exchange,提问作者zono
相关产品推荐
相关产品推荐

