建立基于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 ...
随机推荐
- P4452 [国家集训队]航班安排(最大费用最大流)
P4452 [国家集训队]航班安排 题目传送门 解题思路: 感觉题面让人有很多误解,就是说有k架飞机在0点从0号机场起飞,在t时刻返回机场,给出空载飞行的时间和花费以及m个包机请求的花费和起始时间和终 ...
- tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows
缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...
- 关于 JavaSrcipt 前端开发的建议:模块化开发
JavaScript 是一种优秀的脚本语言. 在 JavaScript 的诞生之初,便于 浏览器 密不可分,如今它更是到了服务器中大展身手. 但是这里不叙述服务端的开发建议. Script 翻译过来就 ...
- Day of Week
题目1043:Day of Week 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1544 解决:609 题目描述: We now use the Gregorian style of ...
- centos 配置自动启动(nginx为例)
[Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin ...
- java中的四种监听类用法
在此列举四种方法: 自身类实现ActionListener接口,作为事件监听器 通过匿名类处理 通过内部类处理 通过外部类处理 下面依次介绍: 第一种:自身类实现ActionListener接口,作为 ...
- python代码迷之错误(ModuleNotFoundError: No module named 'caffe.proto')
1.pandas.read_csv book[n]下的print(n) 总图片数是少一张的,print(n)发现也是少了一个序号 仔细查找后发现缺少99号,即最后一张图片没有被读取.print(m)时 ...
- Codeforces 1248C Ivan the Fool and the Probability Theory(推公式)
题意 一个n*m的网格图,每个格子可以染黑色.白色,问你每个格子最多有一个相邻颜色相同的方案数 n,m<=1e5 思路 我们先处理\(1 \times m\)的情况 设\(f[i][j]\)为前 ...
- BZOJ 4034 [HAOI2015]树上操作(欧拉序+线段树)
题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- Go语言实现:【剑指offer】左旋转字符串
该题目来源于牛客网<剑指offer>专题. 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左 ...