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