Linux docker02 docker实战-最简构建编译系统

该系列文章的目的旨在docker的基础学习和docker的实战应用。

0 why docker

使用docker构建编译系统并将编译系统和源代码作隔离和解耦合,那为啥要这么搞呢?

  • 一方面是因为很多时候我们在本地编译代码,比如很多嵌入式Linux开发,如果不小心host系统崩溃了,要重新装一遍环境,而这个对于长年累月构建的环境 即便有参考文档,想还原也是很耗时的,而且如果文档中漏掉一些细节,这个坑就更大了。新电脑也一样,重装环境是一件好蛋疼的事情阿~。
  • 另一方面是如果新人加入团队,这种大规模复杂的环境构建就要浪费掉一个人很多精力,有的少则一周,多则一个月,对于要快速推进的项目来说无疑是致命的,我们使用docker就是尽可能少做无用功,来了就可以直接作有意义的事情,大幅度提升效率。
  • 当一个开发和测试、运维开始撕比的时候,经常出现的一个锅是 我们开发时候没这个bug阿,你们测试杂会出现这种鬼问题,你们环境的问题,自己搞定阿,好不容易测试也没问题了,运维出问题了,你们代码有问题,研发:你们沙比吧,自己环境的问题自己搞定阿,我们只负责代码。而docker就是同步这个运行环境的,看,代码和环境大家都一样了,事儿少了,锅也甩的少了,这就是docker的魅力。

有了上一章节:Linux docker(01) 基础操作 的基础,我们谈谈实战中是如何构建最简镜像的。

1 自己构建docker编译镜像

1.1 构建x86_64 ubuntu20.04 LTS android11编译镜像

@1 拉基础镜像

$docker pull ubuntu:20.04

@2 run镜像

通过docker images 查看IMAGE ID,这里根据需求需使用it即可:

#docker run -it --name [docker name ] [IMAGE ID]  /bin/bash
$docker run -it --name ubuntu_android_docker ca2056b7d9a8  /bin/bash

@3 安装android源码编译相关软件

sudo apt-get install git-core gnupg flex bison build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 \ lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev \
libxml2-utils xsltproc unzip fontconfig cmake make openjdk-8-dbg openjdk-8-demo \ 
openjdk-8-doc openjdk-8-jdk-headless openjdk-8-jdk openjdk-8-jre-headless openjdk-8-jre-zero openjdk-8-jre openjdk-8-source android-platform-tools-base \
android-sdk-platform-tools-common git gitk gradle 

@4 输出镜像

安装软件结束后通过docker ps -a 命令找到对应的CONTAINER ID,通过命令:

#docker export [container ID] > [mirror.tar]/[{system+ver}_{platform+ver}_build]
$docker export 0a34bdfb87f7 > ubuntu2004_android11_build.tar

导出镜像ubuntu2004_android11_build.tar。

1.2 构建x86_64 ubuntu20.04 LTS clang14编译镜像

@1 拉基础镜像

根据需求这里有两个版本,一个是纯命令行版本,仅用户编译。如下:

$docker pull ubuntu:20.04

另一个是桌面版本:GitHub fcwu/docker-ubuntu-vnc-desktop,可用于编译和直接测试,该版本是可以使用VNC软件以及web网页直接访问的。如下:

$docker pull dorowu/ubuntu-desktop-lxde-vnc:focal

@2 run镜像

通过docker images 查看IMAGE ID,这里根据需求需使用it即可:

#docker run -it --name [docker name ] [IMAGE ID]  /bin/bash
$docker run -it --name ubuntu_x86_64_docker 1ad81968215c /bin/bash

如果是桌面版本,需要兼顾web网页端的设置,run命令为:

$docker run -p 6080:80 -v /dev/shm:/dev/shm dorowu/ubuntu-desktop-lxde-vnc

然后在web网页端输入127.0.0.1:6080即可访问desktop桌面。

@3 安装软件

对于安装软件,命令行版和桌面版是一致的,编辑/etc/apt/source.list文件,追加以下两行内容:

deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main

执行命令集:

#安装前执行update
sudo apt update
#有时候会报key不识别的问题,直接记录key值,然后执行以下指令即可
#sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [key ID]
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 78BD65473CB3BD13
#install clang14 step process (order,step by step)
# LLVM
sudo apt-get install  -y libllvm-14-ocaml-dev libllvm14 llvm-14 llvm-14-dev llvm-14-doc llvm-14-examples llvm-14-runtime
# Clang and co
sudo apt-get install -y clang-14 clang-tools-14 clang-14-doc libclang-common-14-dev libclang-14-dev libclang1-14 clang-format-14 python3-clang-14 clangd-14 clang-tidy-14
# libfuzzer
sudo apt-get install -y libfuzzer-14-dev
# lldb
sudo apt-get install -y lldb-14
# lld (linker)
sudo apt-get install -y lld-14
# libc++
sudo apt-get install -y libc++-14-dev libc++abi-14-dev
# OpenMP
sudo apt-get install -y libomp-14-dev
# libclc
sudo apt-get install -y libclc-14-dev
# libunwind
sudo apt-get install -y libunwind-14-dev
# mlir
sudo apt-get install -y libmlir-14-dev mlir-14-tools

构建环境结束

@4 输出镜像

安装软件结束后通过docker ps -a 命令找到对应的CONTAINER ID,通过命令:

#docker export [container ID] > [mirror.tar]/[{system+ver}_{platform+ver}_build]
#terminal version
$docker export 1ad81968215c > ubuntu2004_x86_64_build.tar
#desktop version
$docker export 6e9f30f53bc1 > ubuntu2004_desktop_x86_64_build.tar

1.3 构建aarch64 嵌入式debian11 clang14 编译镜像

@1 拉镜像

$docker pull balenalib/aarch64-debian

@2 run镜像

#docker run -it --name [docker name ] [IMAGE ID]  /bin/bash
$docker run -it --name debian_aarch64_docker 7edac6f7fa24 /bin/bash

@3 安装软件

编辑/etc/apt/source.list文件,追加以下两行内容:

deb http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-14 main
deb-src http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-14 main

执行命令集:

#安装前执行update
sudo apt update
#有时候会报key不识别的问题,直接记录key值,然后执行以下指令即可
#sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [key ID]
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 78BD65473CB3BD13
#install clang14 step process (order,step by step)
# LLVM
sudo apt-get install  -y libllvm-14-ocaml-dev libllvm14 llvm-14 llvm-14-dev llvm-14-doc llvm-14-examples llvm-14-runtime
# Clang and co
sudo apt-get install -y clang-14 clang-tools-14 clang-14-doc libclang-common-14-dev libclang-14-dev libclang1-14 clang-format-14 python3-clang-14 clangd-14 clang-tidy-14
# libfuzzer
sudo apt-get install -y libfuzzer-14-dev
# lldb
sudo apt-get install -y lldb-14
# lld (linker)
sudo apt-get install -y lld-14
# libc++
sudo apt-get install -y libc++-14-dev libc++abi-14-dev
# OpenMP
sudo apt-get install -y libomp-14-dev
# libclc
sudo apt-get install -y libclc-14-dev
# libunwind
sudo apt-get install -y libunwind-14-dev
# mlir
sudo apt-get install -y libmlir-14-dev mlir-14-tools

构建环境结束

@4 输出镜像

安装软件结束后通过docker ps -a 命令找到对应的CONTAINER ID,通过命令:

#docker export [container ID] > [mirror.tar]/[{system+ver}_{platform+ver}_build]
$docker export 376b1d358c53 > Debian11_aarch64_build.tar

到这里各种docker的镜像tar压缩文件就都输出出来了。接下来就要给到测试/运维 以及其他研发组使用了。那么怎么使用呢?

2 客户/团队伙伴使用docker

所有docker,从引入到绑定数据卷使用的流程都一致,因此这里仅以Debian11_aarch64_build为例进行流程的说明。

@1 导入镜像 docker import

首先从组内服务器上下载该docker镜像/压缩文件到本地,然后进行import操作:

cat ./Debian11_aarch64_build.tar | docker import - Debian11_aarch64_build

接下来直接docker images就可以看到该镜像了,记录该IMAGE ID。

@2 绑定数据卷,并使用该镜像

运行docker run命令:

#docker run -it -v [本地绝对路径]:[docker绝对路径] --name [docker name] [IMAGE ID]  /bin/bash
$docker run -it -v /data/repository:/root/repository --name myaarch64docker fb8066fe6a80  /bin/bash

如果是桌面版,则要考虑到web页面相关配置,命令如下:

$docker run -p 6080:80 -v /dev/shm:/dev/shm -v /data/irisview_a:/root/irisview --name ubuntu_desktop bdb3bdf5de72 /bin/bash

然后在web网页端输入127.0.0.1:6080即可访问desktop桌面。

进入到该docker镜像中后就可以操作仓库中的编译脚本(build.sh)和代码了,执行对应的编译脚本即可,实际上和以前直接在linux主机上的流程一致。而编译后生成的二进制文件在本机上进行相同操作即可。

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...