问题描述
当我使用 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>