星期三, 9月 10, 2014

docker 小記

最近試著寫 Dockerfile,遇到了一些問題,也順利解決了,所以紀錄在這裡:
  1. 使用 apt-get install 時,會因為某些套件的安裝設定而跳出對話方塊,這會導致安裝被阻塞住。這可以藉著 debconf 來避免:
    ENV DEBIAN_FRONTEND noninteractive
    ENV TERM linux
    RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
    其中那兩行設置環境變數似乎不起作用的樣子,主要還是第三行。
  2. 找 不到 add-apt-repository 指令。這是因為基礎的 image 裡沒有的關係,得使用 apt-get install python-software-properties 來安裝,在 Trusty ,也就是 14.04 裡,得再多安裝 software-properties-common
  3. 用 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
  4. 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
  5. apt-get install 時,都加上 -y 選項以避免詢問。
  6. 不要更動 sources.list,原因是我有試著更換為台灣的替換來源,但卻會出現無法下載某些套件的情況。
  7. 如果是要搭 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
  8. 清理 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
  9. Dockerfile 最後最好是來個 apt-get clean,可以減少 image 空間。
  10. 由 於 docker 特性,image 是一層一層疊上去的,只要有指令更動,就會多一層,這有點像 git/svn repository 的概念。在用 docker build 做好 image 以後,你會想只要一個 image 就好,這時候你需要的關鍵字是 flatten 。使用的指令是 export 跟 improt:
    docker export red_panda | docker import - exampleimagelocal:new
關於 Docker push/pull
  1. 首先需要有 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 。
  2. push 的方法,就我感覺是有點隱晦。要 push ,得先為 image 加上 tag,例如:
    docker tag 06a3d360b8e2 localhost:5000/myrepo
    docker push localhost:5000/myrepo
  3. pull 的話,就這樣用:
    docker pull localhost:5000/myrepo
資料來源:

沒有留言: