Dockerfile
Dockerfile是一個文本文件,用來定制鏡像。
鏡像是分層存儲的,前一層會是下一層的基礎。而鏡像的定制就是定制每一層鏡像在上一層做了什么改變。
Dockerfile其內包含一條條指令,每條指令構建一層,定義對上一層做了什么改變。
以定制spring cloud的eureka注冊中心為例:
工程結構為idea默認生成的eureka工程,使用maven package 生成jar包:
Dockerfile如下:
#以java8為父鏡像
FROM java:8
#將maven打包的jar包復制到/register.jar
ADD ./target/register-0.0.1-SNAPSHOT.jar /register.jar
#暴露容器的8761端口
EXPOSE 8761
#執行java -jar /register.jar命令
CMD ["java", "-jar", "/register.jar"]
在當前目錄執行docker build -t register .
可以看到每一條指令都生成了一個鏡像,我們可以使用docker images -a
查看所有的鏡像。
但我們再次執行docker build -t register .
時會發現每一條指令都顯示Using cache
,這就是鏡像分層存儲的意義——構建緩存。
常用指令
- FROM 指定基礎鏡像
- RUN 執行命令
- RUN
,如: RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
- RUN ["可執行文件", "參數1", "參數2"]
- RUN
- COPY 復制文件
COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
- 源路徑可以是多個,甚至可以是通配符,其通配符規則要滿足 Go 的
filepath.Match
規則
- ADD 更高級的復制文件
ADD
與COPY
基本一致,區別在ADD源路徑可以是url,且如果<源路徑>
為一個tar
壓縮文件的話,壓縮格式為gzip
,bzip2
以及xz
的情況下,ADD
指令將會自動解壓縮這個壓縮文件到<目標路徑>
去。- 在 Docker 官方的 Dockerfile 最佳實踐文檔 中要求,盡可能的使用
COPY
,因為COPY
的語義很明確,就是復制文件而已,而ADD
則包含了更復雜的功能,其行為也不一定很清晰。最適合使用ADD
的場合,就是所提及的需要自動解壓縮的場合。
- CMD 容器啟動命令
- ENTRYPOINT 入口點
ENTRYPOINT
與CMD
的目的一樣,都是指定容器啟動程序與參數。- 當指定了
ENTRYPOINT
后,CMD
的含義就發生了改變,不再是直接的運行其命令,而是將CMD
的內容作為參數傳給ENTRYPOINT
指令
- ENV 設置環境變量
- ARG 構建參數
- VOLUME 定義匿名卷
- EXPOSE 暴露端口
詳細介紹,可以查看Docker——從入門到實踐
鏡像構建上下文
上面我們構建鏡像時使用docker build -t register .
,.
就是在指定構建的上下文,其作用在於執行docker build
命令時會將該目錄下的內容打包交給 Docker 引擎,以便后續的ADD
/COPY
找到需要復制的文件。
下圖紅線標記可以看出發送了43mb的文件給Docker引擎。
ps:只會打包構建上下文下的文件和文件夾,不會打包父目錄,所以使用ADD ../register.jar
會報找不到文件。