Spring Boot 2.3发布后带来了新特性之一就是对构建镜像的便捷支持,声称不用写dockerfile就能方便的构建docker image,最近刚好在写一个项目于是折腾了一下,只能说还不太适合国内用户,最终还是老老实实的写了dockerfile需要挂上代理才能勉强可用,下文记录折腾的过程。

更新 2020年6月19日

尝试了诸如gcr.io的国内镜像、docker tag更改image的名字为原版gcr.io/等其他几种办法之后,发现只有挂全局代理才可以走通。

  • Windows下可以使用Proxifier设置全局代理,Proxifier的使用比较简单,网上说的比较多,如这一篇

  • 全局代理设置好,一切都OK了,如果走代理下载镜像比较慢,可以先把镜像从国内镜像源里拉到本地。然后再改Tag的名字,这样能跳过下载镜像的环节。

    docker pull registry.cn-hangzhou.aliyuncs.com/lefer/paketo-buildpacks:0.3
    # docker tag imageid tag:version
    docker tag 87c89aeacd48 paketo-buildpacks/builder:base-platform-api-0.3
  • build-image现在的机制是即使本地已经有了对应的image,每次它还要访问一次gcr.io,这样就要求每次构建的时候都要挂全局代理……好吧,只能等着以后的更新解决这些在中国大陆的可用性问题吧。

原文

按照官方文档的指引,Spring Boot V2.3.0 M默认就包含了自动构建相关的插件,只需要在项目根目录执行下面一行命令即可:

./mvnw spring-boot:build-image

第一次执行这个命令有点久,应该是在下载一些必要资源。满怀期待的等待了一会,结果编译失败,发现日志报错无法拉取一个builder image

Pulling builder image  gcr.io/paketo-buildpacks/builder:base-platform-api-0.3

尝试了一下,这个gcr.io下的镜像的确无法拉取到,即使给mavendocker以及spring-boot-maven-plugin都挂上代理也不成。

  • maven proxy config

    <proxies>
    <proxy>
    <id>optional</id>
    <active>true</active>
    <protocol>http</protocol>
    <username>proxyuser</username>
    <password>proxypass</password>-->
    <host>192.168.3.54</host>
    <port>80</port>
    </proxy>
    </proxies>
  • docker proxy config

    因为我是docker desktop,只需要在docker desktop的GUI里配置proxy即可。

  • spring-boot-maven-plugin proxy config

    <project>
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.3.0.RELEASE</version>
    <configuration>
    <image>
    <env>
    <HTTP_PROXY>http://proxy.example.com</HTTP_PROXY>
    <HTTPS_PROXY>https://proxy.example.com</HTTPS_PROXY>
    </env>
    </image>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>

没辙,然后想了一个取巧的办法,就是通过阿里云的镜像仓库支持海外构建的特性将base-platform-api-0.3拉到阿里云镜像仓库里去,这样就能绕过网络不通的问题。

于是在GitHub里建了一个仓库,里面只需要放一个Dockerfile,直接引用gcr.io的image即可。

FROM gcr.io/paketo-buildpacks/builder:base-platform-api-0.3

然后在阿里云的镜像仓库里配置从这个代码仓库构建镜像。构建完成的镜像可以通过命令拉取。

docker pull registry.cn-hangzhou.aliyuncs.com/lefer/paketo-buildpacks:0.3

然后告诉spring-boot-maven-plugin插件,这个builder镜像要从阿里云里拉取,配置如下:

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>registry.cn-hangzhou.aliyuncs.com/lefer/paketo-buildpacks:0.3</builder>
</image>
</configuration>
</plugin>
</plugins>
</build>

再重新执行./mvnw spring-boot:build-image果然顺畅的通过了这一步,还没待高兴,又报出无法拉取另一个镜像:gcr.io/paketo-buildpacks/run:base-cnb,研究了一番发现这个镜像还没办法通过配置项指明使用一个第三方的镜像替代,只好洗洗睡吧。

有谁解决了这个问题,麻烦留言告诉我…(lll¬ω¬)