Dockerfile的理解

Dockerfile文件詳解git

Docker鏡像的製做有docker commit 和Dockerfile,官方推薦使用Dockerfile來製做github

經過一個實例來看下docker鏡像的製做過程:docker

一、建立一個Dockerfile的文件ubuntu

二、在文件中寫入下面代碼:vim

FROM ubuntu
RUN apt-get install -y vim

三、執行docker bulid命令來構建鏡像bash

docker build -t new-ubuntu .

這條命令-t參數指定新的鏡像的名稱;點「.」 表明的是Dockerfile文件的路徑,因爲案例的Dockerfile就在當前目錄下面因此就用點符號來標識ide

從這個輸出中咱們能夠看到真正的構建過程 首先 Docker 將 build context 中的全部文件發送給 Docker daemon。build context 爲鏡像構建提供所須要的文件或目錄。memcached

Dockerfile 中的 ADD、COPY 等命令能夠將 build context 中的文件添加到鏡像。ui

此例中,build context 爲當前目錄 /root,該目錄下的全部文件和子目錄都會被髮送給 Docker daemon。url


因此,使用 build context 就得當心了,不要將多餘文件放到 build context,特別不要把 /、/usr 做爲 build context,不然構建過程會至關緩慢甚至失敗。


Dockerfile文件中的其餘關鍵字

FROM 是基於那個基礎鏡像

RUN 須要安裝的軟件

MAINTAINER 鏡像建立者的信息

CMD :容器啓動時須要執行的命令;可是在一個Dockerfile文件中只能有一個CMD命令,若是有多個,只執行最後一個CMD命令

若是在啓動容器的時候指定了命令,那麼這個命令會替換掉容器鏡像中默認寫的CMD命令

ENTRYPOINT:

container啓動時執行的命令,可是一個Dockerfile中只能有一條ENTRYPOINT命令,若是多條,則只執行最後一條

ENTRYPOINT沒有CMD的可替換特性

USER:使用那個用戶跑容器

例如:

ENTRYPOINT ["memcached"]

USER daemon

EXPOSE:容器內部開啓的端口,主機上使用還得在啓動容器的時候作端口映射 

docker run -p 80:80 xxx

ENV: 設置環境變量

例如:

ENV LANG en_US.UTF-8

ENV LC_ALL en_US.UTF-8

ADD:將文件<src>拷貝到container的文件系統對應的路徑<dest>


全部拷貝到container中的文件和文件夾權限爲0755,uid和gid爲0


若是文件是可識別的壓縮格式,則docker會幫忙解壓縮



若是要ADD本地文件,則本地文件必須在 docker build <PATH>,指定的<PATH>目錄下

若是要ADD遠程文件,則遠程文件必須在 docker build <PATH>,指定的<PATH>目錄下。好比:


docker build github.com/creack/docker-firefox


docker-firefox目錄下必須有Dockerfile和要ADD的文件



注意:使用docker build - < somefile方式進行build,是不能直接將本地文件ADD到container中。只能ADD

url file.


ADD只有在build鏡像的時候運行一次,後面運行container的時候不會再從新加載了。


VOLUME



能夠將本地文件夾或者其餘container的文件夾掛載到container中。


WORKDIR



切換目錄用,能夠屢次切換(至關於cd命令),對RUN,CMD,ENTRYPOINT生效


ONBUILD



ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行


參考文獻:

http://cloudman.blog.51cto.com/10425448/1923921

http://blog.csdn.net/wsscy2004/article/details/25878223

相關文章
相關標籤/搜索