基础镜像的选择
目前要在docker容器中快速构建单独的c编译和运行环境,主流场景还是基于linux基础镜像添加c语言相关的编译运行依赖包后构建完成,目前主流的centos和ubuntu系列镜像均可,下面我们以ubuntu22.04为例,来进行c编译和运行环境的准备
基础构建步骤
上一步确定好基础镜像后,dockerfile的基础镜像就确定了,可以开始编写dockerfile了
首先准备好一个ubuntu的国内软件源文件,替换默认的源,这里我们使用清华的源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
下面开始编写完整的dockerfile
FROM ubuntu:22.04
COPY sources.list /etc/apt/sources.list # 将上一步的软件源替换默认软件源
这里可以看到,上面的dockerfile我们仅完成了替换软件源这件事,下面我们开始准备要编译的代码
通常要编译的代码会有单独的代码管理工具,我们在构建时实时去拉取最新的代码和指定的分支,用于后续编译
FROM ubuntu:22.04
COPY sources.list /etc/apt/sources.list # 将上一步的软件源替换默认软件源
ARG branch
ARG repo
RUN set -eux && \
apt-get update && \
apt-get install -y git && \
git clone -b $branch $repo
在拉取代码后,我们再切换至代码目录中,安装基础的编译包和程序依赖的包后运行程序的编译命令
FROM ubuntu:22.04
COPY sources.list /etc/apt/sources.list # 将上一步的软件源替换默认软件源
ARG branch
ARG repo
RUN set -eux && \
apt-get update && \
apt-get install -y git && \
git clone -b $branch $repo
WORKDIR /xxx
RUN apt-get install -y git build-essential libssl-dev libboost-all-dev libreadline-dev cmake peg && \
apt-get install -y xxx && \ #安装程序需要的第三方c语言函数包
cmake xxx # 运行程序需要的编译命令
记住,在我们完成编译后,软件非开源情况下需要将拉取的代码目录删除掉,留下编译后的程序执行
FROM ubuntu:22.04
COPY sources.list /etc/apt/sources.list # 将上一步的软件源替换默认软件源
ARG branch
ARG repo
RUN set -eux && \
apt-get update && \
apt-get install -y git && \
git clone -b $branch $repo
WORKDIR /xxx
RUN apt-get install -y git build-essential libssl-dev libboost-all-dev libreadline-dev cmake peg && \
apt-get install -y xxx && \ #安装程序需要的第三方c语言函数包
cmake xxx # 运行程序需要的编译命令 && \
rm -rf /xxx
WORKDIR /xxx #后续运行的主目录
ENTRYPOINT xxx # 设置容器的主进程
这样基于docker的c语言编译和运行的环境就大致准备完成了,根据自己的实际使用需求,可以对它做一些定制化的修改和优化,例如c语言需要的函数包,我们可以从构建参数中获取,这样后续代码改动依赖了新的第三方函数时,我们无需修改我们的dockerfile
注意上面的dockerfile在构建时,需要传入构建参数,例如
docker build -t xxx:xxx . --build-arg branch=xxx repo=xxx ...