在Centos7容器中启用中文支持

文章详细介绍了如何从Dockerhub拉取CentOS7基础镜像,然后通过安装kde-l10n-Chinese和glibc-common等包,添加中文字符集,并通过localedef命令编译语言环境,最后修改环境变量使其启动时支持中文。通过dockercommit创建新的镜像,以便于保存和分发。

从dockerhub拉取的Centos7容器底包不包含中文字符集,因此需要加装中文字符集,本文讲解如何基于centos:centos7的底包,制作启动即支持中文的镜像。

一、拉取centos:centos7的底包

[root@localhost opt] # docker pull centos:centos7

二、通过原始镜像启动容器并制作新的容器

  1. 从原始镜像启动容器。

[root@localhost opt]# docker run -itd --name intsrv centos:centos7             
6fb2ad86f4e1ff0e40f1337a3c05a078264b8523f4b58c9bac9e0c4ad2634e33
  1. 进入容器,将容器内的yum源换为合适的源,因Centos7已停止支持,可以用ISO光盘作源。

[root@localhost opt]# docker exec -it intsrv /bin/bash
[root@6fb2ad86f4e1 /]# rm /etc/yum.repos.d/* -rf
[root@6fb2ad86f4e1 /]# vi /etc/yum.repos.d/http.repo
"/etc/yum.repos.d/http.repo" [New] 5L, 84C written
  1. 查看系统自带的字符集,可见没有中文字符集zh_CN.utf8

[root@6fb2ad86f4e1 /]# locale -a
C
POSIX
en_US.utf8
  1. 安装中文支持包,主要是kde-l10n-Chinese和glibc-common,网上有装fonts的方案,实测也可以,但是安装的附加包相比本方案太多了,不利于容器的轻量化。

[root@6fb2ad86f4e1 /]# yum install kde-l10n-Chinese
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
os                                                                                                                                   | 3.6 kB  00:00:00     
(1/2): os/group_gz                                                                                                                   | 153 kB  00:00:00     
(2/2): os/primary_db                                                                                                                 | 3.3 MB  00:00:00     
Resolving Dependencies
--> Running transaction check
---> Package kde-l10n-Chinese.noarch 0:4.10.5-2.el7 will be installed
--> Processing Dependency: kde-l10n = 4.10.5-2.el7 for package: kde-l10n-Chinese-4.10.5-2.el7.noarch
--> Running transaction check
---> Package kde-l10n.noarch 0:4.10.5-2.el7 will be installed
--> Processing Dependency: kde-filesystem for package: kde-l10n-4.10.5-2.el7.noarch
--> Running transaction check
---> Package kde-filesystem.x86_64 0:4-47.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================================
 Package                                     Arch                              Version                                  Repository                     Size
============================================================================================================================================================
Installing:
 kde-l10n-Chinese                            noarch                            4.10.5-2.el7                             os                            3.5 M
Installing for dependencies:
 kde-filesystem                              x86_64                            4-47.el7                                 os                             48 k
 kde-l10n                                    noarch                            4.10.5-2.el7                             os                             13 k
...
Installed:
  kde-l10n-Chinese.noarch 0:4.10.5-2.el7                                                                                                                    

Dependency Installed:
  kde-filesystem.x86_64 0:4-47.el7                                              kde-l10n.noarch 0:4.10.5-2.el7                                             

Complete!
[root@6fb2ad86f4e1 /]# yum install glibc-common  
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package glibc-common.x86_64 0:2.17-307.el7.1 will be updated
--> Processing Dependency: glibc-common = 2.17-307.el7.1 for package: glibc-2.17-307.el7.1.x86_64
---> Package glibc-common.x86_64 0:2.17-317.el7 will be an update
--> Running transaction check
---> Package glibc.x86_64 0:2.17-307.el7.1 will be updated
---> Package glibc.x86_64 0:2.17-317.el7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================================
 Package                                  Arch                               Version                                   Repository                      Size
============================================================================================================================================================
Updating:
 glibc-common                             x86_64                             2.17-317.el7                              os                              11 M
Updating for dependencies:
 glibc                                    x86_64                             2.17-317.el7                              os                             3.6 M

...

Updated:
  glibc-common.x86_64 0:2.17-317.el7                                                                                                                        

Dependency Updated:
  glibc.x86_64 0:2.17-317.el7                                                                                                                               

Complete!
  1. 再次核查仍并没发现中文字符集,需用localedef命令编译语言环境的定义文件

[root@6fb2ad86f4e1 /]# locale -a
C
POSIX
en_US.utf8
root@6fb2ad86f4e1 /]# localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
  1. 继续检查,这个字符集有了

[root@6fb2ad86f4e1 /]# locale -a
C
POSIX
en_US.utf8
zh_CN.utf8
  1. 修改系统启动后默认使用中文字符集语言环境

网上有多种修改方法,实测以下两种在容器环境中不适用,判断应是容器启动后不会自动加载相应文件:

[root@6fb2ad86f4e1 /]# vi /etc/locale.conf 
[root@6fb2ad86f4e1 /]# cat /etc/locale.conf 
LANG="zh_CN.UTF-8"
[root@6fb2ad86f4e1 /]# echo 'export LANG="zh_CN.utf8"' >>/etc/profile
[root@6fb2ad86f4e1 /]# echo 'export LC_ALL="zh_CN.utf8"' >>/etc/profile      
[root@6fb2ad86f4e1 /]# tail -n2 /etc/profile         
export LANG="zh_CN.utf8"
export LC_ALL="zh_CN.utf8"
  1. 实测在容器中以下方案可行:

[root@6fb2ad86f4e1 /]# echo 'export LANG="zh_CN.utf8"' >>~/.bashrc
[root@6fb2ad86f4e1 /]# echo 'export LC_ALL="zh_CN.utf8"' >>~/.bashrc
[root@6fb2ad86f4e1 /]# tail -n2 ~/.bashrc
export LANG=zh_CN.utf8
export LC_ALL=zh_CN.utf8
  1. 重启容器进行测试

[root@6fb2ad86f4e1 /]# exit
exit
[root@localhost opt]# docker restart intsrv           
intsrv
[root@localhost opt]# docker exec -it intsrv /bin/bash
[root@6fb2ad86f4e1 /]# locale
LANG="zh_CN.utf8"
LC_CTYPE="zh_CN.utf8"
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=zh_CN.utf8
  1. 此时即可通过切换输入法进行中文输入测试

[root@localhost opt]# 中文输入正常

可见当前容器对中文语言已能正常支持。

三、docker commit 提交当前容器为一个新的支持中文环境的镜像

  1. 提交新镜像

[root@localhost opt]# docker commit -m "centos7 with zh_CN.UTF8 20230209" -a "daijianbing"  6fb2ad86f4e1 centos-zh:V7.8.2003
  1. 导出镜像为本地文件便于保存和分发

[root@localhost opt]# docker save -o centos-zh-V7.8.2003.tar centos-zh:V7.8.2003
  1. 通过新镜像重新生成启动一个容器,测试如下,没有问题

通过制作centos7的中文支持镜像,一些老旧的代码又可以迁移到容器中正常运行了,能用就不改,是不变的真理,😄。

<think>我们面对的问题是在CentOS7容器中无法使用sudo命令。根据用户提供的引用信息,我们知道容器的基础镜像是CentOS7,并且在构建过程中执行了`yuminstall-yvim`,但没有提到安装sudo。在CentOS7中,sudo命令通常由sudo包提供。如果容器中没有安装sudo包,那么sudo命令自然不可用。因此,解决方案是安装sudo包。步骤:1.进入容器:如果容器正在运行,可以使用`dockerexec-it<容器名或ID>/bin/bash`进入容器。2.在容器内执行安装命令:`yuminstall-ysudo`但是,用户可能是在构建镜像时就需要sudo命令,那么应该在Dockerfile中安装sudo。例如,修改Dockerfile:```FROMcentos:7MAINTAINERcrisp077<www.crisp077.xyz>RUNyuminstall-yvimsudoWORKDIR/usrCMD/bin/bash```然后重新构建镜像。另外,用户提到引用[2]是关于yum命令无法使用的解决方案。如果遇到yum无法使用的问题(例如网络问题或镜像源问题),需要先解决yum的问题,才能安装sudo。但用户当前的问题描述中没有提到yum有问题,所以我们假设yum可以正常工作。如果用户是在已经运行的容器中,并且没有安装sudo,那么可以进入容器安装。但要注意,容器最好是处于运行状态,并且能够连接网络。但是,如果容器内没有yum或者yum有问题,可以参考引用[2]中的方法,检查并修复yum的配置。引用[2]中提到的是注释掉centosplus的镜像列表,并启用base仓库的baseurl。具体操作如下:编辑/etc/yum.repos.d/CentOS-Base.repo文件,在[base]部分,注释掉mirrorlist行,取消注释baseurl行,并确保它是可用的镜像地址。类似地,可以调整其他仓库的配置。不过,由于用户的问题焦点是sudo不可用,我们优先考虑安装sudo。总结解决方案:1.如果容器正在运行,进入容器安装sudo:```dockerexec-it<容器名或ID>/bin/bashyuminstall-ysudo```2.如果需要在镜像中固定安装sudo,修改Dockerfile,在RUN指令中加入sudo的安装。3.如果遇到yum无法使用,先解决yum的配置问题(如引用[2]所述),再安装sudo。注意:在容器中,通常我们以root用户身份运行,所以可能不需要sudo。但如果有非root用户,并且需要sudo权限,那么安装sudo是必要的。安装后,还需要配置sudoers文件,赋予相应用户sudo权限。如果用户需要为非root用户配置sudo,可以执行:`visudo`然后在文件中添加一行:`<用户名>ALL=(ALL)ALL`但注意:容器内可能没有安装visudo,所以也可以直接编辑/etc/sudoers文件(使用vim或其他编辑器),但要注意权限和语法。不过,在容器中使用非root用户并配置sudo的情况较少,因为容器通常以单一进程运行,且推荐以最小权限运行。如果用户确实需要,再考虑配置。因此,核心解决方案是安装sudo包。相关问题:1.为什么在CentOS7容器中默认没有sudo?2.如何配置sudoers文件以允许特定用户使用sudo?3.在Docker容器中使用非root用户有什么好处?4.如何解决CentOS7容器中yum无法使用的问题?</think>### CentOS 7 容器中 `sudo` 命令不可用的解决方案 在 CentOS 7 容器中 `sudo` 命令不可用,通常是因为基础镜像未预装 sudo 包。以下是逐步解决方案: #### 解决方案步骤: 1. **进入容器**(若容器正在运行): ```bash docker exec -it <容器名或ID> /bin/bash ``` 2. **安装 sudo 包**: ```bash yum install -y sudo ``` > 注:需确保容器网络正常且 yum 源可用[^1][^2] 3. **验证安装**: ```bash sudo --version ``` #### 永久解决方案(修改 Dockerfile): 若需在构建镜像时预装 sudo,修改 Dockerfile: ```dockerfile FROM centos:7 MAINTAINER crisp077 <www.crisp077.xyz> RUN yum install -y vim sudo # 添加 sudo 安装 WORKDIR /usr CMD /bin/bash ``` 重新构建镜像: ```bash docker build -t centos7-with-sudo . ``` #### 常见问题排查: - **yum 不可用**:参考引用[2]修复 yum 源配置,检查 `/etc/yum.repos.d/` 下的仓库文件。 - **权限不足**:容器默认以 root 用户运行,无需 sudo。若需普通用户使用 sudo: ```bash useradd testuser echo "testuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers ``` #### 技术原理: CentOS 7 基础镜像(约 200MB)为精简设计,未包含非必需软件包。`sudo` 作为独立软件包,需显式安装Docker 的镜像分层机制保证安装后的镜像可复用[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代先生.重庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值