docker打包rpmlinux
在完成了docker代碼的編寫和測試以後,如何發佈docker程序?在centos上,通常使用RPM包進行打包。本文主要github
RPM主要包括兩種,一種是以二進制代碼發佈,一種是以源碼發佈。咱們這裏docker主要採用二進制代碼發佈。golang
RPM至少須要兩個部分:web
有了這些。使用rpmbuild工具就能夠一鍵打包了。這裏的關鍵就是編寫spec文件。sql
要編寫spec文件。要知道docker的RPM包應該包含什麼。docker
以一個下載好的rpm包,能夠查看其依賴。vim
[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包來查看。centos
[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的腳本等。bash
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就能夠了