Dockerfile再戀筆記 | 詳解篇

前言
今晚整理整理dockerfile作為再戀筆記。
那誰沒事安心后隨筆整理,想想都心痛。


Dockerfile

? Dockerfile是用于自定義構建Docker鏡像的規則文件。編輯好了Dockerfile文件后,使用docker build即可構建一個鏡像。構建一個怎樣的鏡像那就得看Dockerfile文件。我們來看看具體的Docker有哪些內容與規則。


基本結構

(1) 文件的編輯類似鍵值對,一個鍵配置一個值,規范而言,鍵為大寫、值要小寫

(2) 使用#注釋

(3) 整體分為四個部分:鏡像信息、作者信息、鏡像構建指令信息、容器啟動執行指令信息


指令說明

  • FROM from

    說明:指定構建的鏡像基于哪個鏡像,該指令必須位于Dockerfile的第一個指令,倘若不存在該鏡像,那就默認從Docker hub拉下來。

    FROM <image>
    # or
    FROM <image><:tag>
    

    示例 :基于debain的jessie版本

    FROM debian:jessie
    
  • **MAINTAINER ** maintainer

    說明:描述構建者的信息等等。

    MAINTAINER <message>
    

    示例:作者AlicFeng 郵箱alic@samego.com

    MAINAINER AlicFeng <alic@samego.com>
    
  • **RUN ** run

    說明:構建鏡像要執行的shell指令,默認通過/bin/sh解析器進行解析,也可以指定解析器。

    RUN <command>
    # or 
    RUN ["executable","param1","param2"]
    

    示例 1 :更新源并安裝并安裝make,注意安裝時一定要使用-y,不然有時會出錯

    RUN apt-get update \
      apt-get install make
    

    示例2:執行 ls -lshell指令,并指定/bin/bash解析器

    RUN ["/bin/bash","ls","-l"]
    
  • CMD cmd

    說明:構建的容器啟動時要執行的指令。注意主注意注意、cmd指令只能包含一條,多的話只執行最后一條。

    CMD ["executable", "param1", "param2"]    #將會調用exec執行,首選方式
    # or
    CMD ["param1", "param2"]                  #當使用ENTRYPOINT指令時,為該指令傳遞默認參數
    # or
    CMD <command> ["param1","param2"]         #將會調用/bin/sh -c執行
    

    示例 1:容器啟動時執行/root/start.sh腳本。

    CMD ["/root/start.sh"]
    

    示例 2:執行nginx -g daemon off

    CMD ["nginx", "-g", "daemon off"]
    
  • ENTRYPOINT entrypoint

    說明:entrypoint與cmd指令類似,entrypoint在dockerfile中只能出現一次,否則只執行最后一條。它是配置容器啟動后執行的命令。

    ENTRYPOINT ["executable", "param1", "param2"]       #將會調用exec執行,首選方式
    # or
    ENTRYPOINT <command> ["param1","param2"]              #將會調用/bin/sh -c執行
    

    *示例 *:執行/etc/init.d/nginx restart命令

    ENTRYPOINT ["/etc/init.d/nginx","restart"]
    
  • EXPOSE expose

    說明:指定暴露的端口,供容器之間聯系( -link )使用。

    EXPOSE <port> [.....]
    

    示例:暴露3306端口

    EXPOSE 3306
    
  • ENV env

    說明:指定環境變量,容器運行時也可以指定,這里起到定義的作用。

    ENV <key> <value>
    # or
    ENV <key>=<value>
    

    示例 1:設置一個IP環境變量為127.0.0.1。

    ENV IP=127.0.0.1
    

    示例 2:設置一個ngixn_dir環境變量為/app/server/nginx。

    ENV nginx_dir /app/server/nginx
    WORKDIR $nginx_dir
    
  • ADD add

    說明:拷貝文件,將src拷貝到dest目錄下。注意:src支持文件或目錄或遠程URL,同時src為當前目錄的相對目錄,而dest是容器的絕對路徑,默認拷貝后文件或目錄的權限為0775,要是src為容器可識別的壓縮文件,那么將會自動解壓,這點要注意!

    ADD <src> <dest>
    

    示例 1:拷貝一個遠程文件,該文件的URL為https://sise.samego.com/Linux/redis.tar.gz,注意,該文件為容器識別的文件,將會自動解壓。

    ADD https://sise.samego.com/Linux/redis.tar.gz /app       #執行之后dest為/app/redis/...
    

    示例 2:將/root/bak/conf/redis.conf文件拷貝到/app/redis/目錄下。

    ADD /root/bak/conf/redis.conf /app/redis/
    
  • COPY copy

    說明:copy與add類似,但是copy的功能比較簡潔,沒有add強大,不支持遠程URL,但是src源文件為容器本地文件或目錄的時候,推薦使用copy。

    COPY <src> <dest>
    

    示例:將/root/bak/conf/redis.conf文件拷貝到/app/redis/目錄下。

    ADD /root/bak/conf/redis.conf /app/redis/
    

    ?

  • VOLUME volume

    說明:指定容器的掛載點,使容器中的一個目錄具有持久化存儲數據的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉后,所有的更改都會丟失。當容器中的應用有持久化數據的需求時可以在Dockerfile中使用該指令。

    VOLUME ["path",...]
    

    示例 :掛載/data/mysql/data目錄。

    VOLUME ["/data/mysql/data/"]
    
  • WORKDIR workdir

    說明:指定工作目錄。有時執行RUN指令時需要切換目錄,那就通過workdir指令進行切換。切換目錄后在下一次切換之前都是在此目錄下。可以是相對目錄也可以是絕對路徑。

    WORKDIR <path>
    

    示例:將工作目錄切換至/app/nginx目錄。

    WORKDIR /app/nginx
    
  • USER user

    說明:指定容器運行執行RUN、CMD指令時的用戶,注意:在下一次切換用戶之前將一直使用該用戶。

    USER <username | uid>
    

    示例:切換用戶為same。

    USER alic
    
  • ONBUILD onbuild

    說明:配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。

    ONBUILD [INSTRUCTION]
    

    示例:比如有這樣一個基礎鏡像same:basic,在構建same:latest時,在basic基礎鏡像中使用ONBUILD聲明的ONBUILD RUN apt-get update指令,構建latest版本也將會自動執行。

    # 這是same:basic
    ONBUILD RUN apt-get update
    
    # 這是same:latest正在構建的鏡像
    FROM same:basic
    # 構建時將自動執行基于basic鏡像使用ONBUILD的指令 如下
    RUN apt-get update
    

    構建鏡像示例

    說明:基于alpine:3.5構建一個Redis鏡像。

    FROM alpine:3.5
    
    # 創建一個redis用戶組并創建一個redis用戶將其增加在redis用戶組
    RUN addgroup -S redis && adduser -S -G redis redis
    
    # grab su-exec for easy step-down from root
    RUN apk add --no-cache 'su-exec>=0.2'
    
    # 定義環境變量
    ENV REDIS_VERSION 3.2.8
    ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.8.tar.gz
    ENV REDIS_DOWNLOAD_SHA1 6780d1abb66f33a97aad0edbe020403d0a15b67f
    
    # for redis-sentinel see: http://redis.io/topics/sentinel
    RUN set -ex \
      \
      && apk add --no-cache --virtual .build-deps \
          gcc \
          linux-headers \
          make \
          musl-dev \
          tar \
      \
      && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
      && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
      && mkdir -p /usr/src/redis \
      && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
      && rm redis.tar.gz \
      \
    # Disable Redis protected mode [1] as it is unnecessary in context
    # of Docker. Ports are not automatically exposed when running inside
    # Docker, but rather explicitely by specifying -p / -P.
    # [1] https://github.com/antirez/redis/commit/edd4d555df57dc84265fdfb4ef59a4678832f6da
      && grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 1$' /usr/src/redis/src/server.h \
      && sed -ri 's!^(#define CONFIG_DEFAULT_PROTECTED_MODE) 1$!\1 0!' /usr/src/redis/src/server.h \
      && grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 0$' /usr/src/redis/src/server.h \
    # for future reference, we modify this directly in the source instead of just supplying a default configuration flag because apparently "if you specify any argument to redis-server, [it assumes] you are going to specify everything"
    # see also https://github.com/docker-library/redis/issues/4#issuecomment-50780840
    # (more exactly, this makes sure the default behavior of "save on SIGTERM" stays functional by default)
      \
      && make -C /usr/src/redis \
      && make -C /usr/src/redis install \
      \
      && rm -r /usr/src/redis \
      \
      && apk del .build-deps
    
    # 還是RUN指令
    RUN mkdir /data && chown redis:redis /data
    
    # 指定掛載目錄
    VOLUME /data
    
    # 切換當前的目錄為/data
    WORKDIR /data
    
    # 拷貝文件
    COPY docker-entrypoint.sh /usr/local/bin/
    
    ENTRYPOINT ["docker-entrypoint.sh"]
    
    # 暴露6379端口
    EXPOSE 6379
    
    # 容器啟動時執行redis-server命令
    CMD [ "redis-server" ]
    

    快要閉館了,快速借助redis托管在github的一個Dockerfile作為簡單的示例。

    Alic say :****價值源于技術,貢獻源于分享****

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,786評論 1 21
  • 一、Docker創建鏡像的方式有兩種: 一種通過commit的方式:把做了一系列操作的容器關閉,然后利用docke...
    jie0112閱讀 3,844評論 0 3
  • 轉載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,520評論 0 120
  • 目錄 前言 Dockerfile的書寫規則及指令使用方法 創建Dockerfile,構建運行環境 構建鏡像 Doc...
    garyond閱讀 72,453評論 0 43
  • 1. “每個女孩都有一個愛不了也恨不了的田季安” 這是舒淇有一次發的一條微博,那個田季安,是張震。 很多人都覺得舒...
    _王瘦子閱讀 377評論 0 2