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相关推荐

  1. mvn 打包_Spark源码打包编译的过程

    前言 上篇文章介绍了下 安装sbt环境 启动scala项目 安装SBT环境运行Scala项目 为什么要弄这个 因为我本来是想对spark源码编译部署 spark是用scala语言编译的 spark源码 ...

  2. 通过patch-package创建补丁修改node_modules依赖下的源码

    通过patch-package创建补丁修改node_modules依赖下的源码 前几天一个月薪35k的兄弟,给我推了一个人工智能学习网站,看了一段时间挺有意思的.包括语音识别.机器翻译等从基础到实战都 ...

  3. 萝卜源码前后端源码+打包APP的教程

    简介: 今天分享一个萝卜源码前后端源码+打包APP的教程 我相信很多人都有源码但是不会配置复杂的AS工具导致一直没有打包好属于自己的APP 所以,今天我来了 萝卜前端APPJava源码  先把源码发出 ...

  4. 2016年最经典的高仿系列源码打包下载4.84G

    │  JAVAapk.com文件列表生成.bat │  例子大全说明.txt │  本例子永久更新地址~.url │  目录列表2015.11.04更新.txt                    ...

  5. O2OA二次开发(一)前后端源码打包部署命令

    O2OA二次开发(一)前后端源码打包部署命令 o2oa源代码全部build一次要花费很长时间,有时候我们只是修改了前端代码或者只是修改了后端代码,没必要进行全部重新编译打包. 全部打包命令 执行以下命 ...

  6. PHP安卓苹果APP在线封装打包制作源码 H5手机网站转APP 免签封装绿标

    简介: PHP安卓苹果APP在线封装打包制作源码 H5手机网站转APP 免签封装绿标 更新记录: 1.解决ios无法下载的问题 2.优化打包流程 修复原先各种问题 3.可自行上传安卓证书 4.可自行上 ...

  7. 30款APP源码打包 Java Android安卓App源码 30款打包下载

    [30款APP源码打包 Java Android安卓App源码 30款打包下载](访问密码: 168168)(https://474b.com/file/29013429-461457489)

  8. 互站卖8000的APK打包平台源码+搭建教程,可是实现自动打包app

    互站卖8000的APK打包平台源码+搭建教程,可是实现自动打包app 程序可实现安卓app五分钟自动打包更换包名和签名互站卖8000的APK打包平台源码+搭建教程,可是实现自动打包app 也可以上传打 ...

  9. docker 不包含依赖 打包_2019开启新学习,带你从零了解Docker

    2013年发布至今, Docker是近年来非常火的技术, 一直广受瞩目,被认为可能会改变软件行业.而且Docker不仅仅是Linux Redhat和Canonical等Linux巨头眼里的宠儿,微软等 ...

最新文章

  1. 后MATLAB时代的七种开源替代,一种堪称完美!
  2. nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)...
  3. ajax数据字符串拼接,ajax请求到后台数据,前台不用拼接字符串,一样显示到页面...
  4. 面试题25:合并两个排序的链表
  5. 软件测试桌面检查,静态测试的主要方法 - 测试天下,梦寻人生 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  6. 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
  7. 从零基础转行到前端大牛,需要经过哪几个阶段?
  8. 正则表达式去除括号的问题
  9. 零基础如何考过二级建造师?
  10. 利用composer搭建PHP框架(二.控制器)
  11. MatLab数字图像处理实战(赵小川)-sift原理
  12. excel怎么设置打印区域_淘宝卖家想要打印快递单怎么设置
  13. 卡皇稳了,RTX3090获鲁大师Q1季度最强显卡!
  14. DataV构建大屏(全屏)数据展示页面
  15. css backdrop-filter和border-radius的坑
  16. TreeUtil(树形结构转换)
  17. winrar v3.8 的注册码
  18. 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)
  19. [java实现]辗转相除法
  20. 什么是静态网站?什么是动态网站?

热门文章

  1. 【Java每日一题】20161019
  2. 2012年最佳30款免费 WordPress 主题
  3. 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
  4. 设计社交网络的数据结构
  5. c语言模拟计算机程序阶乘,辽宁省计算机二级(C语言)模拟试卷B(无答案).doc
  6. pb 如何判断数据窗口中是否有某个字段_怎么判断数据窗口中某个字段存在重复的数据...
  7. 工作展望简短_元旦祝福语大全简短
  8. redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)
  9. css悬浮在某个span后面,在contenteditable div中的span元素后面设置光标
  10. Qt连接SQL Server 2014数据库