Docker-in-Docker独立容器存储:Jenkins构建镜像文件异常咨询
这个问题我之前也碰到过,核心原因其实是Docker构建上下文的路径冲突——因为你挂载了Host的Docker套接字,Builder容器里执行的docker build实际是调用Host的Docker引擎,但构建上下文却是容器内部的路径,Host的Docker根本访问不到容器里的文件,自然没法把修改后的文件打包进镜像。下面给你几个具体的解决办法:
将代码checkout到Host目录,再挂载到Builder容器
让Jenkins直接把代码拉取到Host的某个固定目录(比如/var/jenkins/workspace/your-project),启动Builder容器时把这个目录挂载进去:docker run -v /var/run/docker.sock:/var/run/docker.sock -v /var/jenkins/workspace/your-project:/build builder-image然后在Builder容器里进入
/build目录,执行docker build .。这样Host的Docker引擎直接读取Host上的代码目录,修改后的文件自然会被纳入镜像。指定Host侧的构建上下文路径
如果一定要在容器内部处理Dockerfile,可以用docker build的-f参数指定容器内的Dockerfile位置,同时把构建上下文设为Host上的代码目录:docker build -f /container/path/to/Dockerfile /var/jenkins/workspace/your-project这里要注意,Host上的代码目录路径是Host本地的,不是容器里的路径,因为Host的Docker引擎只会读取自己的文件系统。
先验证文件是否存在再构建
在Builder容器的构建步骤前,先加一步ls /path/to/code或者cat modified-file.txt,确认修改后的文件确实存在于容器挂载的目录里。有时候Jenkins的checkout步骤可能因为缓存、分支错误等原因没拉取到最新文件,这一步能帮你排除这种情况。避免用容器内部临时目录作为构建上下文
不要把代码checkout到容器内部的/tmp或者其他未挂载到Host的目录,Host的Docker引擎访问不到这些容器内部的文件,构建时会用空上下文或者旧缓存,导致修改的文件丢失。
简单总结一下:挂载Docker套接字后,docker build的实际执行者是Host的Docker,所以构建上下文必须是Host能访问到的路径——要么直接用Host上的代码目录,要么把代码目录挂载到容器里再构建。
内容的提问来源于stack exchange,提问作者stiller_leser

