如何在spring boot gradle任务“bootBuildImage”构建的cloudfoundry buildpack docker镜像中设置区域设置和编码

问题描述

当我使用 spring boot 应用程序创建 docker 映像时,我看到使用 spring boot 应用程序安装到正在运行的容器中的目录的文件名中存在编码问题。我按照 here 的描述通过 gradle 任务 bootBuildImage 创建了 docker 映像。

当我查看正在运行的容器时,我看到语言环境设置为 posix。在常规 Dockerfile 中,我会运行适当的命令来设置德语 utf-8 语言环境设置。但是 Spring Boot 正在使用 Cloud Foundry buildpacks,我找不到可以连接到语言环境设置的地方。如何在构建过程中调整图像的语言环境?

cnb@9d24bfe67b9e:/$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

解决方法

默认情况下,Spring Boot Gradle 插件使用 Paketo builder image and run image。运行映像为生成的应用映像提供基础操作系统层,这就是语言环境的来源。

覆盖区域设置的一种方法是基于 Paketo 运行映像生成自定义运行映像并在自定义运行映像中设置区域设置。自定义运行映像的 Dockerfile 可能如下所示:

FROM paketobuildpacks/run:base-cnb

USER root
RUN apt-get install -y locales
RUN locale-gen de_DE.utf8
ENV LANG de_DE.UTF-8
ENV LANGUAGE de_DE:de
ENV LC_ALL de_DE.UTF-8

构建并标记自定义运行映像后,您可以在 Spring Boot Gradle 插件 configuration 中使用 runImage 属性或在命令行中使用 {{ 1}} 标志。

,

尽管我认为 Scotts 的答案仍然是最好的,但作为替代选项,您可以为构建器映像设置环境变量,这可以控制最终映像的环境变量。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <env>
                <BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+HeapDumpOnOutOfMemoryError</BPE_APPEND_JAVA_TOOL_OPTIONS>
            </env>
        </image>
    </configuration>
</plugin>

https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#build-image-example-builder-configuration