建立基於docker的編譯環境


如果我們要在一台開發主機上搭一個編譯環境,我們需要安裝一堆依賴庫和編譯工具。如果我們有多個不同的項目同時進行,這些項目的編譯工具和依賴庫又都不一樣,如果我們把這些東西全都塞到一台機器里,會不會有沖突呢?

如果我們想保持開發主機的干凈,做到項目隔離,python里面我們可以切換env。我們也可以用docker來實現開發環境的構建,這樣做還有一個好處,那就是可復用,如果你用docker搭好了一個環境,可以很容易在另一台機器上用docker image構建一個同樣的環境。

 

下面我們想建立一個alpine linux的編譯環境。

首先我們創建一個工作目錄

~/$ mkdir alpine-sdk 
~/$ cd alpine-sdk
~/alpine-sdk$

然后創建容器的Dockerfile,創建容器時我們就將所有必須的package安裝好。因為alpine的apk默認是從美國下載,速度很慢,所以我們修改為從南京大學的鏡像服務器下載,在創建docker image的時候就修改好。

~/alpine-sdk$ cat Dockerfile
FROM alpine:3.7
RUN echo "http://mirrors.nju.edu.cn/alpine/v3.7/main" > /etc/apk/repositories
RUN echo "http://mirrors.nju.edu.cn/alpine/v3.7/community" >> /etc/apk/repositories
RUN apk update
RUN apk upgrade
RUN apk add git alpine-sdk abuild bison flex texinfo zlib-dev cmake bash curl-dev sqlite-dev libressl-dev glib-dev \
         gstreamer-dev gst-plugins-base-dev sbc-dev bluez-dev portaudio-dev glib-dev sbc-dev

這個容器腳本會創建一個新的docker image,它以alpine:3.7為基礎進行構建,並安裝一堆依賴庫和編譯工具

然后我們再創建一個工程環境,包括build,src和一個編譯腳本。src中存放源代碼,build中存放編譯結果。

~/alpine-sdk$ mkdir project
~/alpine-sdk$ cd project
~/alpine-sdk/project$
~/alpine-sdk/project$ ls
build  build.sh  src
~/alpine-sdk/project$ cat build.sh

#!/bin/bash

cd /tmp/project/build
fakeroot=
cmake ../src \
-DGSTREAMER_MEDIA_PLAYER=ON \
-DGST_INCLUDE_DIRS="$fakeroot/usr/include/gstreamer-1.0;$fakeroot/usr/include/glib-2.0;$fakeroot/usr/lib/glib-2.0/include" \
-DGST_LDFLAGS="$fakeroot/usr/lib/libgstreamer-1.0.so;$fakeroot/usr/lib/libgstapp-1.0.so" \
-DPORTAUDIO=ON \
-DPORTAUDIO_LIB_PATH=$fakeroot/usr/lib/libportaudio.so \
-DPORTAUDIO_INCLUDE_DIR=$fakeroot/usr/include \
-DCURL_LIBRARY=$fakeroot/usr/lib/libcurl.so \
-DCURL_INCLUDE_DIR=$fakeroot/usr/include \
-DCMAKE_BUILD_TYPE=DEBUG \
-DBLUETOOTH_BLUEZ=ON \
-DPCC=ON \

make -j 4

然后我們創建docker image

~/alpine-sdk$ docker build -t alpine-sdk .

之后我們就可以用這個docker image來進行編譯了。

~/alpine-sdk$ docker run --rm --mount type=bind,source=/home/dev/alpine-sdk/project,target=/tmp/project alpine-sdk /tmp/project/build.sh

這條指令會將本地目錄mount到容器目錄/tmp/project。這樣子有個好處,在host主機上做的代碼修改會實時同步到容器中,每次修改完代碼,直接執行這條指令就可以重新編譯。然后編譯生成的結果也會同步到host主機上,不需要用docker cp來進行拷貝操作。

 

如果需要與其他開發主機共享docker image,可以將這個image push 到docker hub上去,要用的時候直接下載使用就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM