Dockerfile介紹與指令解析

2021-09-27 08:55:31 字數 2925 閱讀 8583

映象是容器的基礎,每次執行docker run的時候都會指定哪個映象作為容器執行的基礎。我們之前的例子都是使用來自docker hub的映象,直接使用這些映象只能滿足一定的需求,當映象無法滿足我們的需求時,就得自定製這些映象。

映象的定製就是定製每一層所新增的配置、檔案。如果可以把每一層修改、安裝、構建、操作的命令都寫入到乙個指令碼,用指令碼來構建、定製映象,這個指令碼就是dockerfile。

dockerfile 是乙個文字檔案,其內包含了一條條的指令(instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

from scratch # 製作base image基礎映象,盡量使用官方的image作為base image

from centos # 以centos為基礎映象,進行二次構建映象

from ubuntu:14.04 # 帶有tag的base image

label version=「1.0」 # 容器元資訊,幫助資訊,metadata,類似於**注釋

label maintainer=」[email protected]" # 標籤表示作者資訊

#對於複雜的run命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!

run yum update && yum install -y vim \

python-dev # 反斜線換行

run /bin/bash -c "source $home/.bashrc;echo $home」

workdir /root # 相當於linux的cd命令,改變目錄,盡量使用絕對路徑!!!不要用run cd

workdir /test # 如果沒有就自動建立

workdir demo # 再進入demo資料夾

run pwd     # 列印結果應該是/test/demo

add /opt/django/manage.py /opt/  # 把宿主機的/opt/django/manage.py放到容器空間內的/opt/目錄下

add /opt/python3.6.tar.gz /opt/  #add的解壓檔案作用,將宿主機的/opt/下的python3.6.tar.gz解壓到容器內的/opt/目錄下

add and copy

add hello /  #把本地檔案新增到映象中,吧本地的hello可執行檔案拷貝到映象的/目錄

add test.tar.gz /#新增到根目錄並解壓

workdir /root

add hello test/  # 進入/root/ 新增hello可執行命令到test目錄下,也就是/root/test/hello 乙個絕對路徑

copy hello test/  # 等同於上述add效果

# 將宿主機的檔案, 拷貝到容器內,但是沒有解壓縮的命令,盡量使用copy,不要使用add

copy filename /opt/

add與copy

- 優先使用copy命令

-add除了copy功能還有解壓功能

新增遠端檔案/目錄使用curl或wget

env # 環境變數,盡可能使用env增加可維護性

env mysql_version 5.6 # 設定乙個mysql常量,這個$類似於全域性常量

run yum install -y mysql-server=「$」  # 如果版本號有變更,則只需要改這個常量就可以了

儲存和網路

run and cmd and entrypoint

run:執行命令並建立新的image layer

cmd:設定容器啟動後預設執行的命令和引數

entrypoint:設定容器啟動時執行的命令

shell格式和exec格式

run yum install -y vim

cmd echo 」hello docker」

entrypoint echo 「hello docker

run [「apt-get」,」install」,」-y」,」vim」]

cmd [「/bin/echo」,」hello docker」]

entrypoint [「/bin/echo」,」hello docker」]

通過shell格式去執行命令,會讀取$name指令,而exec格式是僅僅的執行乙個命令,而不是shell指令

cat dockerfile

from centos

env name docker

entrypoint [「/bin/echo」,」hello $name」]#這個僅僅是執行echo命令,讀取不了shell變數

entrypoint  [「/bin/bash」,」-c」,」echo hello $name"]

容器啟動時預設執行的命令

如果docker run指定了其他命令(docker run -it [image] /bin/bash ),cmd命令被忽略

如果定義多個cmd,只有最後乙個執行

讓容器以應用程式或服務形式執行

不會被忽略,一定會執行

最佳實踐:寫乙個shell指令碼作為entrypoint

copy docker-entrypoint.sh /usr/local/bin

entrypoint [「docker-entrypoint.sh]

expose 27017

cmd [「mongod」]

[root@master home]# more dockerfilefrom centos

env name docker#cmd ["/bin/bash","-c","echo hello $name"]

entrypoint ["/bin/bash","-c","echo hello $name」]

dockerfile指令介紹

dockerfile指令 cmd,entrypoint,add,copy,volume,workdir,user,onbuild,env等 1.cmd 用於指定乙個容器啟動時要執行的命令。類似於run指令,只是run指令是指定映象被構建時的命令,而cmd是指容器被啟動時要執行的命令 docker r...

Dockerfile 指令 VOLUME 介紹

在介紹volume指令之前,我們來看下如下場景需求 1 容器是基於映象建立的,最後的容器檔案系統包括映象的唯讀層 可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來 或者基於容器建立新的映象 能否可以讓容器程序持久化的資料儲存在主機上呢...

DockerFile 指令命令介紹

2 示例 arg version latest from busybox version arg version run echo version image version from 或from 或from 注意 任何dockerfile中的第一條指令必須為from指令,並且,如果在同乙個dock...