如何用Earthly Target从Dockerfile构建镜像并复用结果?
如何在Earthly中复用Docker-in-Docker构建的镜像
你遇到的核心问题是:用Docker-in-Docker(dind)构建的镜像仅存在于dind容器内部,Earthly的外部环境(包括其他target)无法直接识别这个镜像标签。要解决这个问题,需要把dind里的镜像导出为文件,再导入到Earthly的Docker环境中。
第一步:修改base-image目标,导出镜像为tar包
调整你的Earthfile,在dind构建完成后,把镜像导出成tar文件并保存为Earthly artifact:
base-image: FROM earthly/dind:alpine WORKDIR /build ENV DOCKER_BUILDKIT=1 # 启用BuildKit支持heredoc语法 COPY distroless-runtime-17.Dockerfile Dockerfile WITH DOCKER --allow-privileged RUN docker build . -t base-17-image RUN docker save -o base-17-image.tar base-17-image # 导出镜像为tar包 END SAVE ARTIFACT base-17-image.tar AS LOCAL ./base-17-image.tar # 保存到Earthly artifact仓库
第二步:在其他target中导入并使用镜像
在需要基于该镜像打包应用的target里,先导入tar包到Earthly的Docker环境,之后就能用FROM引用了:
package-app: # 从base-image目标获取导出的tar包 COPY +base-image/base-17-image.tar . # 加载tar包到Earthly的Docker上下文 RUN docker load -i base-17-image.tar # 现在可以直接用base-17-image作为基础镜像 FROM base-17-image # 添加你的应用代码(示例) COPY ./app.jar /opt/app/app.jar # 设置启动命令 CMD ["java", "-javaagent:/opt/app/agent.jar", "-jar", "/opt/app/app.jar"] # 保存最终镜像 SAVE IMAGE my-app-image:latest
原理说明
docker save将dind容器内的镜像打包成tar文件,通过SAVE ARTIFACT让这个文件可以被Earthly的其他target访问。docker load把tar包导入到Earthly使用的Docker环境中,此时base-17-image标签会被Earthly识别,就能正常用FROM引用了。
内容的提问来源于stack exchange,提问作者Kirill
相关产品推荐
相关产品推荐

