解读Dockerfile:文件复制路径与go mod执行目录疑问
Dockerfile与docker build工作机制疑问解答
先纠正并确认你的理解:
- 正确:
golang:1.18-alpine是构建阶段使用的基础镜像,包含Go 1.18运行环境和轻量的Alpine Linux系统。 - 正确:
WORKDIR /app指令会在容器内自动创建/app目录(如果不存在),并将后续所有指令的默认工作目录切换到这里。 - 错误:
COPY go.* ./中的./不是容器主目录,而是当前工作目录——也就是前面WORKDIR设置的/app。这一步是把本地的go.mod和go.sum复制到容器的/app目录下。 - 正确:
go mod download确实是在/app目录内执行的。
核心疑问解答:
go mod download的执行目录
是的,它在/app目录执行。因为WORKDIR /app已经将后续所有指令的默认工作目录设置为/app,除非后续用WORKDIR重新切换,否则RUN、COPY等指令的相对路径操作都基于这个目录。/app何时被填充
执行COPY go.* ./时,本地的go.mod和go.sum已经被复制到容器的/app目录下了,所以此时/app里有这两个文件,不是空的。这一步的目的就是先把依赖描述文件复制进去,让Go可以通过go mod download下载项目依赖,后续再复制全部代码,这样能利用Docker的构建缓存——如果依赖文件没改,这一步的缓存会被复用,不用重复下载依赖。COPY go.* ./中./的具体路径
这里的./就是当前工作目录,也就是WORKDIR指定的/app。Dockerfile中WORKDIR指令的作用是为后续的指令设置默认工作目录,所有相对路径都会基于这个目录解析。
小细节提醒:
你的Dockerfile里的RUN go build -v -o my app指令存在小问题:末尾的app是多余的,应该改成RUN go build -v -o my。因为当前工作目录是/app,里面有main.go,直接执行go build会自动编译当前目录下的主包,指定-o my会生成名为my的可执行文件;如果加上app,Go会把它当作包名去查找,大概率会报错。
内容的提问来源于stack exchange,提问作者Rajeshwar
相关产品推荐
相关产品推荐

