前言:近年來 Docker 非?;?,想要玩好 Docker 的話 Dockerfile 是繞不開的,這就好比想要玩好 Linux 服務(wù)器繞不開 shell 道理是一樣的。今天我們就來聊一聊 Dockerfile 怎么寫,那些指令到底是什么意思。

一、先來看一個(gè)簡單的 Dockerfile
#這個(gè)Dockerfile作用是打一個(gè)python3項(xiàng)目環(huán)境
二、Dockerfile 編寫規(guī)則
指令到小寫不敏感,為了區(qū)分習(xí)慣上用大寫
Dockerfile 非注釋行第一行必須是 FROM
文件名必須是 Dockerfile
Dockerfile 指定一個(gè)專門的目錄為工作空間
所有引入映射的文件必須在這個(gè)工作空間目錄下
Dockerfile 工作空間目錄下支持隱藏文件(.dockeringore)
(.dockeringore)作用是用于存放不需要打包導(dǎo)入鏡像的文件,根目錄就是工作空間目錄
每一條指令都會(huì)生成一個(gè)鏡像層,鏡像層多了執(zhí)行效率就慢,能寫成一條指定的就寫成一條
三、Dockerfile 指令詳解
1.FROM:基礎(chǔ)鏡像
1.1、FROM是Dockerfile文件開篇第一個(gè)非注釋行代碼
2.MAINTAINER:鏡像作者信息
2.1、廢棄了,使用LABLE替代
3.LABLE:鏡像描述信息
3.1、LABLE author="haili"
4.COPY:從 Docker 宿主機(jī)復(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,如果目錄不存在會(huì)自動(dòng)創(chuàng)建,包括他的父目錄
7.VOLUME:數(shù)據(jù)卷,用于在 image 中創(chuàng)建掛載點(diǎn)目錄,以掛載 Docker host 上的卷或者其他容器上的卷
7.1、VOLUM mount_point
8.EXPOSE:為容器打開指定的監(jiān)聽端口以實(shí)現(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)建的時(shí)候需要執(zhí)行的 shell 命令默認(rèn)"/bin/sh -c"運(yùn)行
10.1、docker build過程中需要執(zhí)行的命令
11.CMD:啟動(dòng)容器指定默認(rèn)要運(yùn)行的程序或命令,默認(rèn)"/bin/sh -c"運(yùn)行
11.1、docker run過程中需要執(zhí)行的命令
12.ENTRYPOINT:類型 CMD 指令的功能,用于為容器指定默認(rèn)運(yùn)行程序或命令
1、與CMD不同的是,由ENTRYPOINT啟動(dòng)的程序不會(huì)被docker run命令行指定的參數(shù)覆蓋,這些命令行參數(shù)會(huì)被當(dāng)做參數(shù)傳遞給ENTRYPOINT指定的程序
13.CMD 和 ENTRYPOINT 同時(shí)存在 Dockerfile 中
1、CMD的值會(huì)當(dāng)做參數(shù)傳遞給ENTRYPOINT
14.USER:指定運(yùn)行 image 時(shí)和 Dockerfile 中任何 RUN、CMD、ENTRYPOINT 指令指定的程序的用戶
1、使用用戶名或者UID
15.HEALTHCHECK:健康檢查,定義一個(gè)命令用于檢查主進(jìn)程工作狀態(tài)是否健康
15.1、HEALTHCHECK參數(shù)
16.SHELL:指定運(yùn)行 RUN、CMD、ENTRYPOINT 的 shell 程序
17.OPSIGNAL:給主進(jìn)程發(fā)送信號(hào)
18.ARG:docker build 過程中的參數(shù)
18.1、定義pyton鏡像作者,通過參數(shù)傳入
19.ONBUILD:用于在 Dockerfile 中定義一個(gè)觸發(fā)器
19.1、Dockerfile1中加一個(gè)ONBUILD add file,當(dāng)docker build -t=testpython Dockerfile1的時(shí)候ONBU