概述
大家在构建镜像的时候,经常会从 DockerHub 或者其他外部仓库拉取到一些外部镜像,然而由于有些镜像是很小的,里面没有安装一些常见的软件,比如 curl
, ping
之类的,会导致用户在排查问题的时候,非常困扰,这里主要是不同系统的软件安装工具的配置问题。其实只需要几个步骤,调整原有镜像里的软件安装源配置文件,大部分都是通过各种代理的方法,之后就可以访问期望的软件源了。本文主要总结几个场景 base 镜像更改配置文件,从而可以在容器里 update
和 install
需要的软件。
操作系统
很多同学都不知道自己下的镜像的系统是哪个,可以通过下面几个命令来确认一下,下面是简单的例子。
1
2
3
4
5
6
7
|
# cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.10.3
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
|
软件源和网络代理
企业内部,一般会有自己的软件源,比如 yum 源,pip 源等,这些源可以通过虚拟机或者容器的方式来部署以及提供服务。而容器组一般会要求集群主机需要有一定的网络策略可以访问到这些源,比如通过 NAT 或者静态路由等方式提供,针对这种情况,容器集群内容器一般可以直接访问到这些源。而对于公网上的源,不一定都能通过 NAT 或者静态路由的方式提供给容器直接访问,这里的工作对于主机运维或者是安全组来说可能会因为各种原因难以实现,但是可以要求主机的运维组提供一台可以访问到公网的机器,在容器集群创建实施的时候,将该节点加入到集群,并且部署相关的代理软件,来实现容器对公网的代理访问,可以参考 DOK-squid 来进行部署。
Alpine
Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.
Alpine 里的软件管理工具是 apk
。我们尽量脱离 Google,先从官方手册里找到我们需要的答案,这样有利于自己以后迅速地解决问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# apk
apk-tools 2.10.4, compiled for x86_64.
Installing and removing packages:
add Add PACKAGEs to 'world' and install (or upgrade) them, while ensuring that all dependencies are met
del Remove PACKAGEs from 'world' and uninstall them
System maintenance:
fix Repair package or upgrade it without modifying main dependencies
update Update repository indexes from all remote repositories
upgrade Upgrade currently installed packages to match repositories
cache Download missing PACKAGEs to cache and/or delete unneeded files from cache
Querying information about packages:
info Give detailed information about PACKAGEs or repositories
list List packages by PATTERN and other criteria
dot Generate graphviz graphs
policy Show repository policy for packages
Repository maintenance:
index Create repository index file from FILEs
fetch Download PACKAGEs from global repositories to a local directory
verify Verify package integrity and signature
manifest Show checksums of package contents
Use apk <command> --help for command-specific help.
Use apk --help --verbose for a full command listing.
This apk has coffee making abilities.
|
如果你想更新本地的软件包,显然,这样是不符合 IDC 的网络策略的。
1
2
3
4
5
|
# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.10/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.00740ba1.tar.gz: No such file or directory
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
|
只要修改一下 /etc/apk/repositories/
即可,再 update
看一下。
1
2
3
4
5
|
# echo "https://mirrors.tencent.com/alpine/v3.9/main/" > /etc/apk/repositories
# apk update
fetch https://mirrors.tencent.com/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
v3.9.5-38-gea3990cd06 [https://mirrors.tencent.com/alpine/v3.9/main/]
OK: 5717 distinct packages available
|
apk
命令里安装命令不是 install
是 add
,这在手册里写的也非常清楚了,老忘记的同学可以再看看手册。修改源后,就可以愉快的安装了。
1
2
3
4
5
6
7
8
9
|
# apk add curl
(1/5) Installing ca-certificates (20191127-r0)
(2/5) Installing nghttp2-libs (1.35.1-r1)
(3/5) Installing libssh2 (1.9.0-r1)
(4/5) Installing libcurl (7.64.0-r3)
(5/5) Installing curl (7.64.0-r3)
Executing busybox-1.30.1-r2.trigger
Executing ca-certificates-20191127-r0.trigger
OK: 7 MiB in 19 packages
|
Ubuntu
Ubuntu 中的软件管理工具是 apt
。
1
2
3
4
|
# cat /etc/apt/apt.conf
Acquire::http::Proxy false;
# cat /etc/sources.list
deb http://mirrors.tencent.com/ubuntu bionic main restricted universeurces.list
|
CentOS
CentOS 中的软件管理工具是 yum
。
参考资料
警告
本文最后更新于 2022年4月25日,文中内容可能已过时,请谨慎参考。