最近試著寫 Dockerfile,遇到了一些問題,也順利解決了,所以紀錄在這裡:
- 使用 apt-get install 時,會因為某些套件的安裝設定而跳出對話方塊,這會導致安裝被阻塞住。這可以藉著 debconf 來避免:
ENV DEBIAN_FRONTEND noninteractive
ENV TERM linux
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
其中那兩行設置環境變數似乎不起作用的樣子,主要還是第三行。
- 找
不到 add-apt-repository 指令。這是因為基礎的 image 裡沒有的關係,得使用 apt-get install
python-software-properties 來安裝,在 Trusty ,也就是 14.04 裡,得再多安裝
software-properties-common
- 用 14.04 時,無法安裝 ia32-libs 。到 13.10 以後,ia32-libs 被移除了,改以 multiarch-support 替代,同時,得用 dpkg 聲明要使用 i386 architecture 才能使用 :i386,例如:
RUN dpkg --add-architecture i386
RUN apt-get install multiarch-support gcc-multilib g++-multilib libncurses5-dev:i386
- webupd8 的 Java installer 實際上是個安裝的腳本,會詢問是否同意 Oracle 的 license,才開始下載並安裝。同樣,詢問時也會阻塞住,得用下列指令事先回答同意:
RUN echo oracle-java6-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections
RUN apt-get install -y oracle-java6-installer
- apt-get install 時,都加上 -y 選項以避免詢問。
- 不要更動 sources.list,原因是我有試著更換為台灣的替換來源,但卻會出現無法下載某些套件的情況。
- 如果是要搭 Android 開發環境,下面是我在 14.04 裡試出來該要裝的套件:
RUN apt-get install -y build-essential openjdk-7-jdk multiarch-support
RUN apt-get install -y vim ctags cscope id-utils curl gnupg flex bison
gperf zip curl libc6-dev libswitch-perl libncurses5-dev:i386
x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386
libgl1-mesa-glx:i386 libgl1-mesa-dev gcc-multilib g++-multilib mingw32
tofrodos dialog python-markdown libxml2-utils xsltproc zlib1g-dev:i386
zlib1g-dev
- 清理 container 與 image 的步驟是先刪除 container,再刪除 image。用
docker ps -a -q 可以看 container id,然後用 docker rm 刪除 container,最後再用 docker
rmi 去刪除 image,要砍光光,可以這樣用:
docker ps -a -q | xargs docker rm
docker images -q | xargs docker rmi
- Dockerfile 最後最好是來個 apt-get clean,可以減少 image 空間。
- 由
於 docker 特性,image 是一層一層疊上去的,只要有指令更動,就會多一層,這有點像 git/svn repository 的概念。在用
docker build 做好 image 以後,你會想只要一個 image 就好,這時候你需要的關鍵字是 flatten 。使用的指令是
export 跟 improt:
docker export red_panda | docker import - exampleimagelocal:new
關於 Docker push/pull
- 首先需要有 server,在安裝上非常簡單,你可以參考這篇 How to use your own Registry,但我發現不用那麼麻煩,有 python virtualenv 在手,可以很快裝好。
virtualenv docker-registry-env
cd docker-registry-env
source bin/activate
pip install docker-registry
cp ./lib/python2.7/site-packages/config/config_sample.yml ./lib/python2.7/site-packages/config/config.yml
打完上面指令就裝完了。啟動的話,接著打 docker-registry 就可以。上傳以後的 image/repository 會放在
/tmp/test ,使用的資料庫是 sqlite3 ,則是放在 /tmp/docker-registry.db。如果要調整位置,可以改
./lib/python2.7/site-packages/config/config.yml 裡的
sqlalchemy_index_database 與 dev/test/prod 區段的 storage_path 。
- push 的方法,就我感覺是有點隱晦。要 push ,得先為 image 加上 tag,例如:
docker tag 06a3d360b8e2 localhost:5000/myrepo
docker push localhost:5000/myrepo
- pull 的話,就這樣用:
docker pull localhost:5000/myrepo
資料來源:
沒有留言:
張貼留言