如果我們要在一台開發主機上搭一個編譯環境,我們需要安裝一堆依賴庫和編譯工具。如果我們有多個不同的項目同時進行,這些項目的編譯工具和依賴庫又都不一樣,如果我們把這些東西全都塞到一台機器里,會不會有沖突呢?
如果我們想保持開發主機的干凈,做到項目隔離,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上去,要用的時候直接下載使用就可以了。