docker内镜像的Debian系统

docker镜像运行大多数开发环境都是基于Debian先导层,比如Python3.6的docker镜像或Java环境。相当于镜像内部有一个针对开发环境进行定制的操作系统,在大多数情形下,无论是调试还是部署,都不需要完整的Debian发行版操作系统。特别是在使用docker进行部署时,考虑到部署环境对docker镜像大小的要求,大多数情形下都是使用阉割版的Debian。而阉割版的Debian系统功能受限,很多常见的命令无法使用。
我在一次任务中使用一个slim版的Debian,发现在代码中无法解析中文(中文文件名、中文路径等)

//查看当前系统编码
root@a0d222e3c533:# 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=

解决过程

  1. 查看容器内系统默认字符集
root@a0d222e3c533:# locale charmap
	ANSI_X3.4-1968  //当前编码格式为ANSI_X3.4-1968 , 一旦遇到中文便会报错
  1. 尝试下载中文字符集
//安装中文包:
apt-get install language-pack-zh-hans

遇到报错:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package language-pack-zh-hans

尝试先更新进行

apt-get update
apt-get upgrade

结果一致,并且在upgrade时有不少包出现connection time out的错误,于是进行下一步

  1. 更换Debian系统软件源为国内阿里云源
    开整:
cd /etc/apt
cp sources.list sources.list.bak
vim sources.list

然后 得到了

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package vim

换成vi sources.list

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package vi

emmm… 这下我意识到了问题,想要换源没有文本编辑器改路径,想要下载文本编辑器需要先换源。。。
就在我傻掉了一会儿之后,我猛然想起还有echo这位大哥(脑袋宕机,轻喷)

  1. 使用echo命令进行换源
    以下是正确操作步骤:
    使用cat sources.list查看系统现有源路径
    将系统源路径中网址部分改为mirrors.aliyun.com.例如:
deb http://mirrors.aliyun.com/debian bullseye main  //后面的debian bullseye main来自于cat的内容

然后使用

echo  "deb http://mirrors.aliyun.com/debian bullseye main" >/etc/apt/sources.list
echo  "deb http://mirrors.aliyun.com/debian-security bullseye-security main" >>/etc/apt/sources.list
echo  "deb http://mirrors.aliyun.com/debian bullseye-updates main" >>/etc/apt/sources.list

将源路径写入到sources.list文件中,使用apt update && apt upgrade进行更新,换源成功。
这一步有坑的地方:不能简单的使用网上别人的阿里云或清华源路径,例如

deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

这种路径不一定在当前的系统中能够正常运行与下载。

  1. 更新中文字符集为默认字符集
    安装并生成中文字符集
apt install -y locales
sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen  
locale-gen

生成了中文字符集,通过locale -a命令可以看到有zh_CN.utf8,然后配置中文字符集为默认字符集:

update-locale LANG=zh_CN.UTF-8   //这里无报错
locale charmap          // 查看系统默认字符集

发现依然是ANSI_X3.4-1968 。emmm…
猜想是阉割版debain上下文环境导致不能直接用命令进行update。

  1. 使用dockerfile进行配置
    利用现有镜像生成新的镜像,生成过程中配置dockerfile,大致如下:
FROM debian:latest  
  
# 设置字符集  
ENV LC_ALL=zh_CN.utf8  
ENV LANG=zh_CN.utf8  
ENV LANGUAGE=zh_CN.utf8  
  
# 其他构建指令...

构建成功后,使用docker run...运行镜像,在容器内输入locale charmap发现已正常配置为中文字符集。至此docker镜像内的Debian系统换源和更新中文字符集工作完成。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐