docker初學之使用 Dockerfile 定制鏡像


鏡像的定制實際上就是定制每一層所 添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳 本,用這個腳本來構建、定制鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問 題、體積的問題就都會解決。這個腳本就是 Dockerfile。 Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層, 因此每一條指令的內容,就是描述該層應當如何構建。

以定制 python鏡像為例,這次我們使用 Dockerfile 來定制。 在一個空白目錄中,建立一個文本文件,並命名為 Dockerfile:

$ mkdir xgp
$ cd xgp
$ touch Dockerfile
其內容為:

FROM python
RUN echo "my name is xgp"

 

這個 Dockerfile 很簡單,一共就兩行。涉及到了兩條指令, FROM 和 RUN 。

FROM 指定基礎鏡像

所謂定制鏡像,那一定是以一個鏡像為基礎,在其上進行定制。就像我們之前運行了一個 nginx 鏡像的容器,再進行修改一樣,基礎鏡像是必須指定的。而 FROM 就是指定基礎鏡 像,因此一個 Dockerfile 中 FROM 是必備的指令,並且必須是第一條指令。 在 Docker Store 上有非常多的高質量的官方鏡像,有可以直接拿來使用的服務類的鏡像,如 nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;也有一些方便開發、構 建、運行各種語言應用的鏡像,如 node 、 openjdk 、 python 、 ruby 、 golang 等。可以 在其中尋找一個最符合我們最終目標的鏡像為基礎鏡像進行定制。

RUN 執行命令

RUN 指令是用來執行命令行命令的。由於命令行的強大能力, RUN 指令在定制鏡像時是最 常用的指令之一。

其格式有兩種: shell 格式: RUN <命令> ,就像直接在命令行中輸入的命令一樣。剛才寫的 Dockerfile 中 的 RUN 指令就是這種格式。

既然 RUN 就像 Shell 腳本一樣可以執行命令,那么我們是否就可以像 Shell 腳本一樣把每個 命令對應一個 RUN 呢?比如這樣:

FROM debian:jessie RUN apt-get update RUN apt-get install -y gcc libc6-dev make RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" RUN mkdir -p /usr/src/redis RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 RUN make -C /usr/src/redis RUN make -C /usr/src/redis install

之前說過,Dockerfile 中每一個指令都會建立一層, RUN 也不例外。每一個 RUN 的行為, 就和剛才我們手工建立鏡像的過程一樣:新建立一層,在其上執行這些命令,執行結束 后, commit 這一層的修改,構成新的鏡像。 使用 Dockerfile 定制鏡像 73 而上面的這種寫法,創建了 7 層鏡像。這是完全沒有意義的,而且很多運行時不需要的東 西,都被裝進了鏡像里,比如編譯環境、更新的軟件包等等。結果就是產生非常臃腫、非常 多層的鏡像,不僅僅增加了構建部署的時間,也很容易出錯。

構建鏡像

 

首先是下載Python鏡像,然后執行docker build.

 Dockerfile編寫命令

FROM: 指定基礎鏡像 RUN: 構建鏡像過程中需要執行的命令。可以有多條。 CMD:添加啟動容器時需要執行的命令。多條只有最后一條生效。可以在啟動容器時被覆蓋和修改。 ENTRYPOINT:同CMD,但這個一定會被執行,不會被覆蓋修改。 LABEL :為鏡像添加對應的數據。 MLABELAINTAINER:表明鏡像的作者。將被遺棄,被LABEL代替。 EXPOSE:設置對外暴露的端口。 ENV:設置執行命令時的環境變量,並且在構建完成后,仍然生效 ARG:設置只在構建過程中使用的環境變量,構建完成后,將消失 ADD:將本地文件或目錄拷貝到鏡像的文件系統中。能解壓特定格式文件,能將URL作為要拷貝的文件 COPY:將本地文件或目錄拷貝到鏡像的文件系統中。 VOLUME:添加數據卷 USER:指定以哪個用戶的名義執行RUN, CMD 和ENTRYPOINT等命令 WORKDIR:設置工作目錄 ONBUILD:如果制作的鏡像被另一個Dockerfile使用,將在那里被執行Docekrfile命令 STOPSIGNAL:設置容器退出時發出的關閉信號。 HEALTHCHECK:設置容器狀態檢查。 SHELL:更改執行shell命令的程序。Linux的默認shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]

參考作者:https://www.jianshu.com/p/4f06d8d5da11

以及docker書籍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM