如何直接在安装Docker的Linux服务器上构建镜像无需传输本地文件?
问题解答
核心前提说明
不能直接在Dockerfile中将ARG JAR_FILE写为服务器的任意绝对路径:Docker构建时仅能读取构建上下文(即执行docker build命令时指定的目录及其子目录)内的文件,路径不在上下文范围内的话COPY指令会直接报错。
你需要的「不用手动把文件复制到服务器、直接在服务端构建镜像」的需求完全可以实现,推荐以下3种方案:
方案1:通过Docker远程访问从Windows端触发服务端构建(最适配你的场景)
该方案无需手动传输任何文件,构建上下文会自动从Windows同步到服务器,原有Dockerfile不用做任何修改。
- 第一步:Linux服务器端配置Docker开放远程访问
编辑Docker服务配置文件(通常为/usr/lib/systemd/system/docker.service),修改ExecStart配置项,在原有参数后追加:
注意:生产环境必须配置TLS认证避免未授权访问风险,测试环境可临时用上述配置。-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
执行以下命令重启Docker生效:systemctl daemon-reload systemctl restart docker - 第二步:Windows本地配置Docker客户端指向远程服务端
打开PowerShell/CMD,执行临时生效命令:set DOCKER_HOST=tcp://你的服务器IP:2375 - 第三步:直接在Windows本地执行构建
切换到Windows本地的项目根目录(包含Dockerfile和编译好的jar包的目录),直接执行:
Docker会自动把当前目录作为构建上下文传输到服务端,完成镜像构建,全程不需要手动复制文件。docker build -t 自定义镜像名 .
方案2:服务器本地构建(仅需传输jar包)
如果不想开放Docker远程端口,可仅把编译好的jar包传到服务器,调整构建命令即可:
- 把Dockerfile上传到服务器任意目录,比如
/opt/docker/Dockerfile - 把jar包传到服务器的固定目录,比如
/opt/build/jars/ - 执行构建时指定上下文为jar包所在目录:
此时Dockerfile中的docker build -t 自定义镜像名 -f /opt/docker/Dockerfile /opt/build/jars/ARG JAR_FILE可以修改为ARG JAR_FILE=./*.jar,即可正常读取jar包。
方案3:共享目录挂载构建
如果你的Windows项目目录已经通过SMB、NFS等协议共享挂载到Linux服务器,直接在服务器上进入挂载后的项目目录,执行docker build命令即可,无需手动复制文件。
注意:使用远程构建方案时,建议在项目根目录添加
.dockerignore文件,排除node_modules、日志、临时缓存等无关文件,避免构建上下文传输过慢。
内容的提问来源于stack exchange,提问作者nee nee
相关产品推荐
相关产品推荐

