docker 不包含依赖 打包_docker源码打包RPM
docker打包rpm
在完成了docker代码的编写和测试之后,如何发布docker程序?在centos上,一般使用RPM包进行打包。本文主要
RPM主要包括两种,一种是以二进制代码发布,一种是以源码发布。我们这里docker主要采用二进制代码发布。
RPM至少需要两个部分:
spec文件。用以说明该rpm包的版本信息、依赖、所包含的文件、打包的流程等
源文件。
有了这些。使用rpmbuild工具就可以一键打包了。这里的关键就是编写spec文件。
要编写spec文件。要知道docker的RPM包应该包含什么。
以一个下载好的rpm包,可以查看其依赖。
[root@xxx ~]# rpm -qpR docker-io-1.3.2-2.el6.x86_64.rpm
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
bridge-utils
chkconfig
chkconfig
config(docker-io) = 1.3.2-2.el6
device-mapper-libs >= 1.02.90-1
initscripts
libc.so.6()(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libcgroup
libdevmapper.so.1.02()(64bit)
libdevmapper.so.1.02(Base)(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libsqlite3.so.0()(64bit)
lxc
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(VersionedDependencies) <= 3.0.3-1
rtld(GNU_HASH)
xz
rpmlib(PayloadIsXz) <= 5.2-1
同样,以一个下载的rpm包来查看。
[root@xxx ~]# rpm -qpl docker-io-1.3.0-1.el6.x86_64.rpm
/etc/rc.d/init.d/docker
/etc/sysconfig/docker
/etc/sysconfig/docker-storage
/etc/udev/rules.d/80-docker.rules
/usr/bin/docker
/usr/libexec/docker
/usr/libexec/docker/dockerinit
/usr/share/bash-completion/completions/docker
/usr/share/doc/docker-io-1.3.0
/usr/share/doc/docker-io-1.3.0/AUTHORS
/usr/share/doc/docker-io-1.3.0/CHANGELOG.md
/usr/share/doc/docker-io-1.3.0/CONTRIBUTING.md
/usr/share/doc/docker-io-1.3.0/LICENSE
/usr/share/doc/docker-io-1.3.0/LICENSE-vim-syntax
/usr/share/doc/docker-io-1.3.0/MAINTAINERS
/usr/share/doc/docker-io-1.3.0/NOTICE
/usr/share/doc/docker-io-1.3.0/README-vim-syntax.md
/usr/share/doc/docker-io-1.3.0/README.md
/usr/share/man/man1/docker-attach.1.gz
/usr/share/man/man1/docker-build.1.gz
/usr/share/man/man1/docker-commit.1.gz
/usr/share/man/man1/docker-cp.1.gz
/usr/share/man/man1/docker-create.1.gz
/usr/share/man/man1/docker-diff.1.gz
/usr/share/man/man1/docker-events.1.gz
/usr/share/man/man1/docker-exec.1.gz
/usr/share/man/man1/docker-export.1.gz
/usr/share/man/man1/docker-history.1.gz
/usr/share/man/man1/docker-images.1.gz
/usr/share/man/man1/docker-import.1.gz
/usr/share/man/man1/docker-info.1.gz
/usr/share/man/man1/docker-inspect.1.gz
/usr/share/man/man1/docker-kill.1.gz
/usr/share/man/man1/docker-load.1.gz
/usr/share/man/man1/docker-login.1.gz
/usr/share/man/man1/docker-logout.1.gz
/usr/share/man/man1/docker-logs.1.gz
/usr/share/man/man1/docker-pause.1.gz
/usr/share/man/man1/docker-port.1.gz
/usr/share/man/man1/docker-ps.1.gz
/usr/share/man/man1/docker-pull.1.gz
/usr/share/man/man1/docker-push.1.gz
/usr/share/man/man1/docker-restart.1.gz
/usr/share/man/man1/docker-rm.1.gz
/usr/share/man/man1/docker-rmi.1.gz
/usr/share/man/man1/docker-run.1.gz
/usr/share/man/man1/docker-save.1.gz
/usr/share/man/man1/docker-search.1.gz
/usr/share/man/man1/docker-start.1.gz
/usr/share/man/man1/docker-stop.1.gz
/usr/share/man/man1/docker-tag.1.gz
/usr/share/man/man1/docker-top.1.gz
/usr/share/man/man1/docker-unpause.1.gz
/usr/share/man/man1/docker-version.1.gz
/usr/share/man/man1/docker-wait.1.gz
/usr/share/man/man1/docker.1.gz
/usr/share/man/man5/Dockerfile.5.gz
/usr/share/vim/vimfiles/doc/dockerfile.txt
/usr/share/vim/vimfiles/ftdetect/dockerfile.vim
/usr/share/vim/vimfiles/syntax/dockerfile.vim
/usr/share/zsh/site-functions/_docker
/var/lib/docker
可以看到其实里面包含的荣还是很丰富的,不仅仅是docker的二进制代码,还有很多工具。比如自动补全配置,man的相关命令解释,vim的配置,以及init.d的脚本等。
docker提供了一个比较好的方法,就是在run一个容器进行编译。
docker编译出来的二进制代码有两种方式。一种是通过make binary,编译出来的可执行文件,只有一个docker可执行文件。另一种是通过make dynbinary,编译出需要动态链接库的可执行文件。
前者的好处是不需要动态链接,相当于all in one。但是在实际中,一般都是通过后者。当动态链接函数库升级时,不必跟随重新编译docker代码。
但是默认的Dockerfile是FROM Ubunt14.04。编译出来的动态链接库会依赖于glibc2.14以上版本。而centos6默认的glibc是2.12。因此需要重新搭建一个docker的编译环境。重写的Dockerfile如下:
FROM centos:centos6
RUN yum install -y tar git hg rpmdevtools gcc glibc-static device-mapper-devel
RUN rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN yum install -y pandoc golang go-md2man
RUN mkdir -p /go
这个编译环境的唯一缺点是不能够编译btrfs的驱动。btrfs的驱动需要在centos7以上才能编译运行(centos6的btrfs-progs-devel始终找不到)。但是一般centos下是使用dm作为存储驱动,也足够使用了。
自己编译SPEC文件较为繁琐,其实可以直接参考github上的两个项目已经编写的SPEC文件
他们的SPEC中在build时,需要安装golang的若干包,实际这些包都在docker/vendor文件夹中有了,不需要单独安装(安装也可以,可以使用最新的包。但是注意版本一致)。
至于如何打包centos6下的docker RPM包,主要参考了docker-rpm-el6项目,做了一个自动化的Makefile。
项目开源在github上。有兴趣的可以使用,如果有用,帮忙star一下。
具体使用方法就是将整个项目docker-rpm-centos6放置在docker源码的hack文件夹中。
然后cd hack/docker-rpm-centos6。直接运行make就可以了
docker 不包含依赖 打包_docker源码打包RPM相关推荐
- mvn 打包_Spark源码打包编译的过程
前言 上篇文章介绍了下 安装sbt环境 启动scala项目 安装SBT环境运行Scala项目 为什么要弄这个 因为我本来是想对spark源码编译部署 spark是用scala语言编译的 spark源码 ...
- 通过patch-package创建补丁修改node_modules依赖下的源码
通过patch-package创建补丁修改node_modules依赖下的源码 前几天一个月薪35k的兄弟,给我推了一个人工智能学习网站,看了一段时间挺有意思的.包括语音识别.机器翻译等从基础到实战都 ...
- 萝卜源码前后端源码+打包APP的教程
简介: 今天分享一个萝卜源码前后端源码+打包APP的教程 我相信很多人都有源码但是不会配置复杂的AS工具导致一直没有打包好属于自己的APP 所以,今天我来了 萝卜前端APPJava源码 先把源码发出 ...
- 2016年最经典的高仿系列源码打包下载4.84G
│ JAVAapk.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2015.11.04更新.txt ...
- O2OA二次开发(一)前后端源码打包部署命令
O2OA二次开发(一)前后端源码打包部署命令 o2oa源代码全部build一次要花费很长时间,有时候我们只是修改了前端代码或者只是修改了后端代码,没必要进行全部重新编译打包. 全部打包命令 执行以下命 ...
- PHP安卓苹果APP在线封装打包制作源码 H5手机网站转APP 免签封装绿标
简介: PHP安卓苹果APP在线封装打包制作源码 H5手机网站转APP 免签封装绿标 更新记录: 1.解决ios无法下载的问题 2.优化打包流程 修复原先各种问题 3.可自行上传安卓证书 4.可自行上 ...
- 30款APP源码打包 Java Android安卓App源码 30款打包下载
[30款APP源码打包 Java Android安卓App源码 30款打包下载](访问密码: 168168)(https://474b.com/file/29013429-461457489)
- 互站卖8000的APK打包平台源码+搭建教程,可是实现自动打包app
互站卖8000的APK打包平台源码+搭建教程,可是实现自动打包app 程序可实现安卓app五分钟自动打包更换包名和签名互站卖8000的APK打包平台源码+搭建教程,可是实现自动打包app 也可以上传打 ...
- docker 不包含依赖 打包_2019开启新学习,带你从零了解Docker
2013年发布至今, Docker是近年来非常火的技术, 一直广受瞩目,被认为可能会改变软件行业.而且Docker不仅仅是Linux Redhat和Canonical等Linux巨头眼里的宠儿,微软等 ...
最新文章
- 后MATLAB时代的七种开源替代,一种堪称完美!
- nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)...
- ajax数据字符串拼接,ajax请求到后台数据,前台不用拼接字符串,一样显示到页面...
- 面试题25:合并两个排序的链表
- 软件测试桌面检查,静态测试的主要方法 - 测试天下,梦寻人生 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
- 从零基础转行到前端大牛,需要经过哪几个阶段?
- 正则表达式去除括号的问题
- 零基础如何考过二级建造师?
- 利用composer搭建PHP框架(二.控制器)
- MatLab数字图像处理实战(赵小川)-sift原理
- excel怎么设置打印区域_淘宝卖家想要打印快递单怎么设置
- 卡皇稳了,RTX3090获鲁大师Q1季度最强显卡!
- DataV构建大屏(全屏)数据展示页面
- css backdrop-filter和border-radius的坑
- TreeUtil(树形结构转换)
- winrar v3.8 的注册码
- 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)
- [java实现]辗转相除法
- 什么是静态网站?什么是动态网站?
热门文章
- 【Java每日一题】20161019
- 2012年最佳30款免费 WordPress 主题
- 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
- 设计社交网络的数据结构
- c语言模拟计算机程序阶乘,辽宁省计算机二级(C语言)模拟试卷B(无答案).doc
- pb 如何判断数据窗口中是否有某个字段_怎么判断数据窗口中某个字段存在重复的数据...
- 工作展望简短_元旦祝福语大全简短
- redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)
- css悬浮在某个span后面,在contenteditable div中的span元素后面设置光标
- Qt连接SQL Server 2014数据库