建立基于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上去,要用的时候直接下载使用就可以了。
建立基于docker的编译环境的更多相关文章
- EOS Dapp开发(1)-基于Docker的开发环境搭建
随着EOS主网的上线,相信基于EOS的Dapp开发会越来越多,查阅了很多资料相关的开发资料都不是很多,只能自己摸索,按照网上仅有的几篇教程,先git clonehttps://github.com/E ...
- Ubuntu 基于Docker的TensorFlow 环境搭建
基于Docker的TensorFlow 环境搭建 基于(ubuntu 16.04LTS/ubuntu 14.04LTS) 一.docker环境安装 1)更新.安装依赖包 sudo apt-get up ...
- Ubuntu系统下基于docker部署Jenkins环境
本文是在ubuntu环境下安装jenkins,jenkins运行在docker容器中, 至于docker如何安装,请参考https://www.cnblogs.com/xingyunqiu/p/115 ...
- 基于docker构建测试环境
目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...
- 基于Docker搭建LNMP环境(转)
关于什么是docker,建议大家先上网查查有关的用法.如果您不了解,在这篇文章中,您可以简单的理解为他是一个轻量级的虚拟机. 一.docker安装mysql 首先,我们从仓库拉取一个MySql的镜像 ...
- 快速建立Linux c/c++编译环境
sudo apt-get install build-essential 省时又省心~
- 基于docker的 Hyperledger Fabric 多机环境搭建(上)
环境:ubuntu 16.04 Docker 17.04.0-ce go 1.7.4 consoul v0.8.0.4 ======================================= ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-1-基本使用
Docker vagrant提供了使用Docker作为provider(其他的provider有virtualBox.VMware\hyper-V等)的开箱即用支持.这允许你的开发环境由Docker容 ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-0-简介
原文https://www.hashicorp.com/blog/feature-preview-docker-based-development-environments Feature Previ ...
随机推荐
- X-CTF(REVERSE入门) re1
运行程序 32位ida打开,shift+f12查看运行时的中文,这里双击flag get字符串进入rdata段 双击后面的函数,进入text段,小的窗口视图里可以看见汇编代码调用函数的句子 右边的即是 ...
- 【Java并发基础】局部变量是线程安全的
前言 方法中的变量(即局部变量)是不存在数据竞争(Data Race)的,也是线程安全的.为了理解为什么,我们先来了一下方法是如何被执行的,然后再分析局部变量的安全性,最后再介绍利用局部变量不会共享的 ...
- HBase学习总结
一.HBase介绍 1.基本概念 HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平 ...
- 毕业论文系列之基于WiFi的智能农业大棚管控系统设计代码
#include <dht11.h>//dht11库 #include <MsTimer2.h> //定时器库的 头文件 #include < ...
- python 内置模块之os、sys、shutil
一.OS模块 用于提供系统级别的操作. OS 目录和文件 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改 ...
- for和while——python中的循环控制语句详解
循环语句在绝大多数的语言中,都是必不可少的一种控制语句,循环语句允许我们执行一个语句或语句组多次.在python中有for循环和while循环两种,讲到这里,就不得不提到我们的迭代器对象 迭代器 迭代 ...
- 一个工程中cpp文件的编译顺序
做了一个实验. 最后build失败,失败的原因是变量i被重定义了.原本按照我的思路,是不应该失败的.因为我用了条件编译,若先编译Source.cpp,则会#define __HEADER_H__并且定 ...
- 【Bullet引擎】刚体类 —— btRigidBody
btRigidBody类主要用于刚体数据的计算. 在模拟刚体动画过程中,可以使用btRigidBody类获取所保存的刚体对象,进而控制刚体对象的旋转和位移.进行刚体模拟计算需要经常用到此类. API: ...
- MongoDB 4.2新特性:分布式事务、字段级加密、通配符索引、物化视图
MongoDB 4.2已经发布,我们来看看它增加了哪些新特性?分布式事务?数据库加密?通配符索引? 在2019年MongoDB World大会上,CTO Eliot Horowitz介绍了MongoD ...
- 获取本机网卡ip地址
import sys, os import socket, struct, fcntl import six import psutil def get_ip(iface="enp0s3&q ...