在docker中启动Tomcat作为下载文件服务器,如果存在中文名的文件,则需要对docker的容器编码格式进行修改,使其能够支持中文,否则将无法在下载中文名文件。

1. 修改docker容器编码格式

直接启动docker容器,发现中文文件在里面显示为乱码

image

查看docker容器编码格式,可以看到当前编码格式为POSIX,这种编码格式不支持中文.

image

我们需要自己修改容器的编码格式。

1.1 安装中文语言包

查看容器所有的语言环境,如果没有中文语言包,则需要自己安装。

image

安装中文语言包:

1
[root@e0f34910ee74 /]# yum install glibc-common

安装好后再次查看语言包信息,出现中文语言包。

image

1.2 docker build生成新的镜像

将下好语言包的容器commit成一个新的镜像

1
[root@host-10-0-251-159 dockerbuild]# docker commit c2eb75865693 webcrawler-service:test

基于这个新镜像写一个Dockerfile,然后基于Dockerfile生成我们需要的镜像。
Dockerfile为

1
2
3
[root@host-10-0-251-159 dockerbuild]# cat Dockerfile
FROM webcrawler-service:test
ENV LANG zh_CN.UTF-8

docker build成新的镜像

1
[root@host-10-0-251-159 dockerbuild]# docker build -t webcrawler-service-new .

基于这个新镜像webcrawler-service-new启动一个容器,进入这个容器,我们可以看到容器编码为我们设置的zh_CN.UTF-8,生成一个新的中文名文件,不再出现乱码。

1
2
[root@host-10-0-251-159 /]# docker run -tid eec4bea /run.sh
[root@host-10-0-251-159 /]# docker exec -ti eec4bea /bin/bash

image

image

2. Tomcat8 HTTP文件下载文件

2.1 修改Tomcat配置文件

在Tomcat安装目录下,修改web.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@eec4bea40bab conf]# vi /usr/local/tomcat/conf/web.xml
……
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value> (把原来的false改为true)
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
……

2.2 创建用于下载的xml文件

在安装目录下的conf/Catalina/localhost/下新建一个xml文件,用于访问下载列表。

1
2
3
4
5
[root@eec4bea40bab conf]# vi /usr/local/tomcat/conf/web.xml
[root@eec4bea40bab conf]# cat /usr/local/tomcat/conf/Catalina/localhost/download.xml
<?xml version="1.0" encoding="utf-8"?>
<Context reloadable="true" docBase="/usr/download" crossContext="true">
</Context>

其中docBase的路径为对外暴露的下载路径,需要存在该路径。
docker容器,对外暴露需要访问的端口,浏览器访问,出现下载列表:

image

因为有需求是文件名需要有中文。一开始中文出现乱码,导致无法下载文件。查阅了网上很多资料,都说是因为Tomcat默认的编码方式是iso8859-1,而iso8859-1不属于中文码表,故而出现乱码。建议修改server.xml文件,将编码方式修改为utf-8: URIEncoding=”utf-8”。我进行尝试后发现依然中文乱码。后来发现Tomcat8默认的编码已经是utf-8了,所以不需要修改server.xml文件 (如果从Tomcat早期版本迁移到Tomcat8需要注意这个问题)。后来多次测试,发现是系统环境的问题,如果系统本身不支持中文,则修改Tomcat后也不支持中文文件的下载,需要先修改系统环境语言。