三、DockerFile 定製屬於自己的專屬鏡像

前言

上篇文章我們知道了怎麼操作鏡像和容器,到基礎都是從已經存在的鏡像開始的,那我們自己怎樣搭建一個鏡像並使用它呢?接下來就讓我們學習使用dockerfile 創建屬於自己的鏡像吧。

dockerfile

在這之前,我們需要知道dockerfile ,因爲我們就是通過dockerfile 來創建鏡像的。那dockerfile 是什麼呢?
dockerfile 是一個文件,文件裏面是我們寫的一條條的指令,然後通過docker build
命令來構建一個鏡像。
現在難就難在這個指令怎麼寫,所以接下讓我們一起看看dockfile 指令吧。

dockerfile 指令

FROM

FROM <image>
FROM <image>:<tag>
#tag是可選的,默認會使用latest版本的基礎鏡像

from 指令是依賴的基礎鏡像,所謂的定製鏡像,是在其他的鏡像上添加一些我們自己東西,定製成我們自己的鏡像。當然我們也可以不依賴任何鏡像,自己從頭開始搭建。那就使用

FROM  scratch

scratch 其實也是一個docker 鏡像,但是這個鏡像比較難特殊,它是一個虛擬鏡像,裏面什麼都沒有,是一個空白的鏡像,所以如果想不依賴任何鏡像,可以使用from scratch

那現在又有一個問題了,dockfile 文件中可以出現多個From 麼?

在docker 17.05 版本之前是不支持出現多個From 的,一個dockefile只能有一個From 指令,且必須放在文件中的第一行。因爲作爲基礎鏡像使用。在docker17.05 後支持多From 。表示構建的多重階段,不過最終生成的鏡像還是以最後一個From 基礎鏡像爲基礎的。

RUN

run 指令 是表示在鏡像構建時運行的指令。
兩種格式:

#shell格式
run <命令>
eg: run apt-get update

#exec 格式
run ["可執行文件",“參數1”,“參數2”...]

COPY

複製文件的指令

copy 源路徑  目標路徑
#支持通配符
eg:copy hom?.txt /mydir/

ADD

add 是更高級的複製。copy 有的功能它都用,它還能訪問網絡資源,源路徑可以是一個URL。源路徑文件也可以是一個壓縮文件,可以直接解壓。
所以如果想要直接複製一個壓縮包進去的話,就要使用COPY 而不能只用ADD了。
官方建議是能使用COPY 的就使用COPY ,因爲COPY 命令語義比較明確就是複製文件,並且ADD 指令會使得鏡像構建緩存失效,使得鏡像構建比較緩慢。

CMD

cmd 指令是表示在運行容器時執行的指令。

#shell 格式
cmd  <命令>
eg:cmd echo $HOME

#exec 格式
cmd ["可執行文件",“參數1”,“參數2”]
eg: cmd ["sh","-c","echo $HOME"]

ENTRYPOINT

entrypoint 入口點

entrypoint <命令>

entrypoint ["可執行文件","參數1","參數2"]

entryPoint 指令和 cmd 指令功能類似,不過entrypoint 可以讓鏡像變成像命令一樣使用,可以做應用運行前的準備工作。這個具體的後面講。

ENV

env 是設置環境變量的指令,

env MY_VERSION 1.0.0

ARG

arg 用於構建時傳遞的參數

arg <參數名>[=<默認值>]

eg: 
arg version
arg myversion=1.0.0

VOLUME

定義匿名卷

volume <路徑>
volume ["<路徑1>",["<路徑2>"...]

eg: volume  /etc/docker/log

EXPOSE

申明端口

expose <端口1>  [<端口2>...]

這裏需要注意的是,expose 是申明容器應用端口,但是容器運行是並不一定就是開啓這個端口提供服務。在dockerfile 中寫入端口申明有兩個好處,一是當做鏡像服務的守護端口,方便映射,二是在運行時使用隨機端口映射時,就會映射的expose設置的端口上。

好了,指令當然不止這些,更多的想了解的查看:

https://docs.docker.com/engine/reference/builder/


還沒有寫完,後續補充,深表歉意

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章