docker镜像内debian系统配置国内镜像源,更新默认字符集支持中文
docker镜像运行大多数开发环境都是基于Debian先导层,比如Python3.6的docker镜像或Java环境。相当于镜像内部有一个针对开发环境进行定制的操作系统,在大多数情形下,无论是调试还是部署,都不需要完整的Debian发行版操作系统。特别是在使用docker进行部署时,考虑到部署环境对docker镜像大小的要求,大多数情形下都是使用阉割版的Debian。我在一次任务中使用一个slim
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=
解决过程
- 查看容器内系统默认字符集
root@a0d222e3c533:# locale charmap
ANSI_X3.4-1968 //当前编码格式为ANSI_X3.4-1968 , 一旦遇到中文便会报错
- 尝试下载中文字符集
//安装中文包:
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的错误,于是进行下一步
- 更换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
这位大哥(脑袋宕机,轻喷)
- 使用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
这种路径不一定在当前的系统中能够正常运行与下载。
- 更新中文字符集为默认字符集
安装并生成中文字符集
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。
- 使用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系统换源和更新中文字符集工作完成。
更多推荐
所有评论(0)