如何向Docker镜像安装rpm软件包
我们在构建镜像容器的时候,容器需要使用的工具,可能在基础镜像中并没有,这时候就需要我们人工的向Docker镜像中补充这些软件工具,这里对这些应用场景进行了实践梳理。
前言
我们在构建镜像容器的时候,容器需要使用的工具,可能在基础镜像中并没有,这时候就需要我们人工的向Docker镜像中补充这些软件工具,这里对这些应用场景进行了实践梳理。
例如,我们在性能测试的时候,往往有很多问题需要JPS、JSTACK等工具帮助分析,如果所有应用都是容器化服务,采用的又是centos自带的openjdk,可能并没有这些工具,这时候需要我们引入安装openjdk-devel包。
我们的应用镜像依赖于基础镜像构建生成,向docker镜像中补充软件工具,这里提供了两种方式作参考:
方式一、Dockerfile在线安装
From centos-77-base:1.0
COPY demo.jar /root/app.jar
COPY run.sh /root
RUN cd /etc/yum.repos.d/
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 前置操作:将宿主机的yum源文件拷到当前repo目录中,对镜像yum源进行替换
COPY ./repo/* /etc/yum.repos.d/
RUN yum -y install java-1.8.0-openjdk-devel.x86_64
ENTRYPOINT ["sh", "/root/run.sh"]
注意:该方式主要通过第8行在容器中执行yum intall命令完成安装,但是在执行的过程中,可能因为容器内yum源无法访问的问题,导致yum install失败。
镜像yum源能否正常访问,可以在容器中执行下列命令测试:
# 列出软件包详情列表
yum list
# 列出制定软件,可以过滤
yum list | grep xxx
如果容器内yum源无法正常访问,但是宿主机的yum源访问正常,执行步骤将宿主机的yum源文件替换到容器内部,来完成rpm软件的正常安装。替换过程参考Dockerfile示例的4-7行。
ps.Docker容器网络模式一般采用桥接模式,如果宿主机可以对yum源进行正常访问,容器依托宿主机NAT地址转换,也是可以对外部网络yum源进行访问的。
方式二、离线安装
如果容器yum源不通,宿主机的yum也无法正常使用,这时候我们也可以考虑离线安装的方式,即找一台yum正常使用的主机,将指定的rpm安装包下载下来,传到打包机中通过DOCKERFILE进行离线安装
Step1.软件包下载:在一台可以正常使用yum的主机上下载安装包
yumdownloader java-1.8.0-openjdk-devel.x86_64
# 加上参数的示例
# -destdir(下载的软件包存放路径)
# -resolve(解决依赖关系并下载所需的包)
yumdownloader --destdir=/tmp --resolve xxx
Step2.将该rpm安装包通过scp命令移植到镜像构建主机中
2.1复制到远程服务器
# 复制文件
scp ./java-1.8.0-openjdk-devel.x86_64.rpm root@10.1.1.34:/home
# 复制目录的话,加上-r参数,示例如下:
scp -r tmp root@10.1.1.34:/home
2.2从远程服务器复制
# 从远程复制文件
scp root@10.1.1.34:/tmp/java-1.8.0-openjdk-devel.x86_64.rpm /home
# 从远端复制目录的话,加上-r参数,示例如下:
scp -r root@10.1.1.34:/tmp /home
Step3.修改Dockerfile将该软件包移植到容器内部,并执行安装操作
From centos-77-base:1.0
COPY demo.jar /root/app.jar
COPY run.sh /root
ADD java-1.8.0-openjdk-devel.x86_64.rpm /root
RUN cd /root && rpm -ivh java-1.8.0-openjdk-devel.x86_64.rpm --force --nodeps
ENTRYPOINT ["sh", "/root/run.sh"]
总结
本文简单介绍了容器镜像通过yum方式安装rpm软件的两种方式,离线方式一般不推荐,有些较为复杂的rpm安装包在下载的时候,其环境依赖受主机影响,相关依赖包可能不准确,向容器中离线安装时,有出现失败的情况,一般优先考虑方式一进行。
更多推荐
所有评论(0)