目录

常见的镜像软件安装问题

概述

大家在构建镜像的时候,经常会从 DockerHub 或者其他外部仓库拉取到一些外部镜像,然而由于有些镜像是很小的,里面没有安装一些常见的软件,比如 curl, ping 之类的,会导致用户在排查问题的时候,非常困扰,这里主要是不同系统的软件安装工具的配置问题。其实只需要几个步骤,调整原有镜像里的软件安装源配置文件,大部分都是通过各种代理的方法,之后就可以访问期望的软件源了。本文主要总结几个场景 base 镜像更改配置文件,从而可以在容器里 updateinstall 需要的软件。

操作系统

很多同学都不知道自己下的镜像的系统是哪个,可以通过下面几个命令来确认一下,下面是简单的例子。

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 命令里安装命令不是 installadd,这在手册里写的也非常清楚了,老忘记的同学可以再看看手册。修改源后,就可以愉快的安装了。

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日,文中内容可能已过时,请谨慎参考。