如果我们要在一台开发主机上搭一个编译环境,我们需要安装一堆依赖库和编译工具。如果我们有多个不同的项目同时进行,这些项目的编译工具和依赖库又都不一样,如果我们把这些东西全都塞到一台机器里,会不会有冲突呢?

如果我们想保持开发主机的干净,做到项目隔离,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上去,要用的时候直接下载使用就可以了。

建立基于docker的编译环境的更多相关文章

  1. EOS Dapp开发(1)-基于Docker的开发环境搭建

    随着EOS主网的上线,相信基于EOS的Dapp开发会越来越多,查阅了很多资料相关的开发资料都不是很多,只能自己摸索,按照网上仅有的几篇教程,先git clonehttps://github.com/E ...

  2. Ubuntu 基于Docker的TensorFlow 环境搭建

    基于Docker的TensorFlow 环境搭建 基于(ubuntu 16.04LTS/ubuntu 14.04LTS) 一.docker环境安装 1)更新.安装依赖包 sudo apt-get up ...

  3. Ubuntu系统下基于docker部署Jenkins环境

    本文是在ubuntu环境下安装jenkins,jenkins运行在docker容器中, 至于docker如何安装,请参考https://www.cnblogs.com/xingyunqiu/p/115 ...

  4. 基于docker构建测试环境

    目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...

  5. 基于Docker搭建LNMP环境(转)

    关于什么是docker,建议大家先上网查查有关的用法.如果您不了解,在这篇文章中,您可以简单的理解为他是一个轻量级的虚拟机. 一.docker安装mysql 首先,我们从仓库拉取一个MySql的镜像 ...

  6. 快速建立Linux c/c++编译环境

    sudo apt-get install build-essential 省时又省心~

  7. 基于docker的 Hyperledger Fabric 多机环境搭建(上)

    环境:ubuntu 16.04 Docker  17.04.0-ce go 1.7.4 consoul v0.8.0.4 ======================================= ...

  8. vagrant特性——基于docker开发环境(docker和vagrant的结合)-1-基本使用

    Docker vagrant提供了使用Docker作为provider(其他的provider有virtualBox.VMware\hyper-V等)的开箱即用支持.这允许你的开发环境由Docker容 ...

  9. vagrant特性——基于docker开发环境(docker和vagrant的结合)-0-简介

    原文https://www.hashicorp.com/blog/feature-preview-docker-based-development-environments Feature Previ ...

随机推荐

  1. linux运维基础知识-系统分区及LVM逻辑卷的创建

    系统分区及LVM逻辑卷的创建 分区 创建逻辑卷 LVM简介:逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,如图 ...

  2. Linux磁盘管理及挂载

    1.在vm workstations添加磁盘 添加完之后重启一下虚拟机 然后fdisk -l 可以看到虚拟机已经识别到了新的磁盘 2.添加磁盘分区 输入命令 fdisk /dev/sdb 命令(输入 ...

  3. golang学习笔记(一):包,变量,函数

    欢迎访问我的博客和github! go 语言学习笔记第一弹,来自 gotour ,以后要常写笔记,把自己学习笔记记录下来,就算只是笔记也要多写. 好记性不如烂笔头,也要多锻炼自己的写作能力. 说实话, ...

  4. ARTS Week 15

    Feb 3, 2020 ~ Feb 9, 2020 Algorithm Problem 172.Factorial Trailing Zeroes(阶乘末尾的0) 题目链接 题目描述:给定一个整数n, ...

  5. sqlserver check running process 1

    check process script 1, check which is current running: use master SELECTspid,ER.percent_complete,CA ...

  6. JAVA 对守护线程的理解

    1.在start之前,setDaemon. 该现场就成为守护线程了. 2.守护现线程并不是主线程结束,子线程(守护线程)也跟着结束.而是守护线程在没有用户线程运行的情况伴随着JVM退出而结束. 示例代 ...

  7. STM32F407的时钟配置

    有3种时钟, HSI,High Speed Internal,默认是这个 HSE,High Speed External,用外置晶振,官方开发板默认晶振为25MHz,stm32f4xx.h中有定义HS ...

  8. jq根据table的tr行数动态删除相应的行

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. OSPF配置实验(一)

    单区域OSPF 命令: R1(config)#router ospf 1        //启动OSPF进程 R1(config-router)#router-id 1.1.1.1        // ...

  10. 杭电------2048神上帝以及老天爷(C语言写)

    #include<stdio.h> ] = { -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,- }; ] = { }; long long jiec ...