You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:15:28