使用Docker搭建CentOS 7编译开发环境
开发的软件要支持多个版本的Linux
平台,最低需要支持到CentOS 7
,以及一些 CentOS 7 的衍生版本。
因为我日常并不使用 CentOS 7,如果在我本机编译的话,会有glibc
版本问题,如果全部依赖都使用静态链接glib
的方式也很麻烦,关于这个问题可以查看 glibc 版本(version 'GLIBC_2.14' not found)问题 。因此我一般都是再 CentOS 7 下进行编译打包发布,这样的话问题会少很多。Golang 的项目在 CentOS 7 下编译也不会出现 FATAL: kernel too old. Kernel
的问题。
如果使用虚拟机的话,就比较重量级了,所以我一般都使用docker
环境来进行项目的编译。放这里做一个环境配置过程的记录和备份。
这个我已经推送到hub.docker.com
上面了,可以直接拉取使用 docker pull liu2g/compilenv:v3
。如果速度太慢,可以使用下面命令进行docker pull dockerproxy.com/liu2g/compilenv:latest && docker tag dockerproxy.com/liu2g/compilenv:latest liu2g/compilenv:latest && docker rmi dockerproxy.com/liu2g/compilenv:latest
。
1、安装 docker 环境
这里就不详细说了,在Linux下基本就是几条命令搞定,可以参考下面文章:
- 【全面详细】Windows10 Docker安装详细教程
- ArchLinux Wiki Docker (简体中文)
- 如何在 Ubuntu 上安装和使用 Docker
- 如何在debian11上安装docker
- centos7安装Docker详细步骤(无坑版教程)
2、创建 centos 7 容器
使用下面命令拉取 centos 7 镜像到本地
docker pull centos:7
使用下面命令创建 centos 7
系统容器
docker run -v /mnt/work:/mnt/work -v /home:/home --name=centos7go --hostname=centos7go --tty centos:7 /bin/bash
我这里绑定了两个目录,这是我需要用的,可以不使用。这里使用--tty
参数,是为了让容器可以一直运行,避免退出exec
就停止了容器运行。
如果需要,可以安装中文语言环境,参考 Docker中centos7的中文支持
# 安装语言包
yum install kde-l10n-Chinese -y
yum install glibc-common -y
# 安装本地化语言运行时需要使用的语言环境对象代码
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
# 写入环境变量到配置
echo "export LC_ALL=zh_CN.utf8" >> ~/.zshrc
3、配置编译环境
配置软件源
先配置yum
镜像仓库地址,以及启用scl
和epel
仓库。
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
#下载阿里云镜像的repo文件
curl /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo > /etc/yum.repos.d/CentOS-Base.repo
# 刷新一下 yum 缓存
yum clean all && yum makecache
# 安装 epel 源
yum install -y epel-release
# 安装 scl 源(devtoolset工具)
yum install -y centos-release-scl
# 安装完成,再次刷新一下缓存
yum clean all && yum makecache
参考:
安装开发环境
安装git
软件,因为默认仓库的git
版本比较低,所以安装rh-git227
。
yum install rh-git227
# 启用,也可以把这个文件软链接到 /etc/profile.d 目录下去
source /opt/rh/rh-git227/enable
# ln -s /opt/rh/rh-git227/enable /etc/profile.d/git.sh
安装 devtoolset
软件包,也可以根据需要安装llvm-toolset
。
# 可以先搜索,根据需要安装对应版本的 devtoolset
yum install -y devtoolset-11
# 使用 scl 命令来启用工具集(也可以之间 source /opt/rh/devtoolset-9/enable)
scl enable devtoolset-11 bash
# ln -s /opt/rh/devtoolset-11/enable /etc/profile.d/devtoolset-11.sh
其他常用的开发工具安装
yum install upx cmake3
ln -s /usr/bin/cmake3 /usr/bin/cmake
yum install golang
go env -w GOPROXY="https://proxy.golang.com.cn,direct"
go env -w GOPATH="/mnt/work/go"
go env -w GOCACHE="/mnt/work/go/cache"
参考:
Dockerfile
将上面全部操作做成了一个Dockerfile文件(多了安装配置 zsh 的过程),内容如下:
FROM centos:7
VOLUME /mnt/work
# 下面依次执行
# 切换yum源,启用 epel 和 scl 软件仓库
# 安装 git2.27
# 安装 devtoolset 11/python3.8/upx/cmake等
# 安装 golang ,并设置环境变量
# 安装中文语言包,并将配置写入环境变量
# 安装 zsh
# 安装 oh-my-zsh,使用 gitee 镜像
RUN cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak \
&& curl https://mirrors.aliyun.com/repo/Centos-7.repo > /etc/yum.repos.d/CentOS-Base.repo \
&& yum clean all && yum makecache \
&& yum install -y epel-release centos-release-scl \
&& yum clean all && yum makecache \
&& yum install -y rh-git227 \
&& ln -s /opt/rh/rh-git227/enable /etc/profile.d/git.sh \
&& yum install -y devtoolset-11 \
&& ln -s /opt/rh/devtoolset-11/enable /etc/profile.d/devtoolset-11.sh \
&& yum install -y rh-python38 \
&& ln -s /opt/rh/rh-python38/enable /etc/profile.d/python38.sh \
&& yum install -y upx cmake3 wget perl-IPC-Cmd \
&& ln -s /usr/bin/cmake3 /usr/bin/cmake \
&& yum install -y autoconf autoconf-archive automake bison libtool binutils \
&& yum install -y golang \
&& go env -w GOPROXY="https://proxy.golang.com.cn,direct" \
&& go env -w GOPATH="/mnt/work/go" \
&& go env -w GOCACHE="/mnt/work/go/cache" \
&& yum install -y kde-l10n-Chinese \
&& yum install -y glibc-common \
&& yum install -y zsh \
&& source /opt/rh/rh-git227/enable \
&& yum clean all \
&& wget https://ghproxy.com/https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh \
&& export REMOTE=https://gitee.com/mirrors/ohmyzsh.git \
&& chmod a+x install.sh \
&& ./install.sh \
&& localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 \
&& echo "export LANG=zh_CN.utf8" >> ~/.zshrc \
&& echo "export LC_ALL=zh_CN.utf8" >> ~/.zshrc
构建命令
docker build -t compilenv:v3 .