前言:近年來 Docker 非忱ǜ模火错邦,想要玩好 Docker 的話 Dockerfile 是繞不開的探赫,這就好比想要玩好 Linux 服務(wù)器繞不開 shell 道理是一樣的。今天我們就來聊一聊 Dockerfile 怎么寫撬呢,那些指令到底是什么意思伦吠。
一、先來看一個簡單的 Dockerfile
#這個Dockerfile作用是打一個python3項目環(huán)境
二魂拦、Dockerfile 編寫規(guī)則
指令到小寫不敏感毛仪,為了區(qū)分習慣上用大寫
Dockerfile 非注釋行第一行必須是 FROM
文件名必須是 Dockerfile
Dockerfile 指定一個專門的目錄為工作空間
所有引入映射的文件必須在這個工作空間目錄下
Dockerfile 工作空間目錄下支持隱藏文件(.dockeringore)
(.dockeringore)作用是用于存放不需要打包導(dǎo)入鏡像的文件,根目錄就是工作空間目錄
每一條指令都會生成一個鏡像層芯勘,鏡像層多了執(zhí)行效率就慢箱靴,能寫成一條指定的就寫成一條
三、Dockerfile 指令詳解
1.FROM:基礎(chǔ)鏡像
1.1荷愕、FROM是Dockerfile文件開篇第一個非注釋行代碼
2.MAINTAINER:鏡像作者信息
2.1衡怀、廢棄了棍矛,使用LABLE替代
3.LABLE:鏡像描述信息
3.1、LABLE author="haili"
4.COPY:從 Docker 宿主機復(fù)制文件至創(chuàng)建的新鏡像文件
4.1抛杨、COPY <src> <dest>
5.ADD:類似于 COPY 指令够委,ADD 支持 tar 文件和 URL 路徑
5.1、ADD <src> <dest>
6.WORKDIR:用于為 Dockerfile 中所有的 RUN怖现、CMD茁帽、ENTRYPOINT、COPY屈嗤、ADD 指定設(shè)定工作目錄
6.1潘拨、WORKDIR /mnt,如果目錄不存在會自動創(chuàng)建恢共,包括他的父目錄
7.VOLUME:數(shù)據(jù)卷战秋,用于在 image 中創(chuàng)建掛載點目錄,以掛載 Docker host 上的卷或者其他容器上的卷
7.1讨韭、VOLUM mount_point
8.EXPOSE:為容器打開指定的監(jiān)聽端口以實現(xiàn)與外部通信
8.1脂信、EXPOSE <port> </portocol>
9.ENV:用于為鏡像定義所需的環(huán)境變量,可以被 Dockerfile 文件中其他命令調(diào)用(ENV透硝、ADD狰闪、COPY、RUN濒生、CMD)
9.1埋泵、ENV key value
10.RUN:docker build 鏡像構(gòu)建的時候需要執(zhí)行的 shell 命令默認"/bin/sh -c"運行
10.1、docker build過程中需要執(zhí)行的命令
11.CMD:啟動容器指定默認要運行的程序或命令罪治,默認"/bin/sh -c"運行
11.1丽声、docker run過程中需要執(zhí)行的命令
12.ENTRYPOINT:類型 CMD 指令的功能,用于為容器指定默認運行程序或命令
1觉义、與CMD不同的是雁社,由ENTRYPOINT啟動的程序不會被docker run命令行指定的參數(shù)覆蓋,這些命令行參數(shù)會被當做參數(shù)傳遞給ENTRYPOINT指定的程序
13.CMD 和 ENTRYPOINT 同時存在 Dockerfile 中
1晒骇、CMD的值會當做參數(shù)傳遞給ENTRYPOINT
14.USER:指定運行 image 時和 Dockerfile 中任何 RUN霉撵、CMD、ENTRYPOINT 指令指定的程序的用戶
1洪囤、使用用戶名或者UID
15.HEALTHCHECK:健康檢查徒坡,定義一個命令用于檢查主進程工作狀態(tài)是否健康
15.1、HEALTHCHECK參數(shù)
16.SHELL:指定運行 RUN瘤缩、CMD喇完、ENTRYPOINT 的 shell 程序
17.OPSIGNAL:給主進程發(fā)送信號
18.ARG:docker build 過程中的參數(shù)
18.1、定義pyton鏡像作者剥啤,通過參數(shù)傳入
19.ONBUILD:用于在 Dockerfile 中定義一個觸發(fā)器
19.1锦溪、Dockerfile1中加一個ONBUILD add file奄喂,當docker build -t=testpython Dockerfile1的時候ONBU