愚公系列2022年01月 Docker容器 Dockerfile詳解

      網友投稿 843 2022-05-30

      前言

      Dockerfile是一個包含用于組合映像的命令的文本文檔??梢允褂迷诿钚兄姓{用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。

      docker build命令用于從Dockerfile構建映像。可以在docker build命令中使用-f標志指向文件系統中任何位置的Dockerfile。

      例:

      docker build -f /path/to/a/Dockerfile

      一、Dockerfile的基本結構

      Docker以從上到下的順序運行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個聲明以#字符開頭則被視為注釋??梢栽贒ocker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

      二、Dockerfile文件指令說明

      Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。

      1.使用 Dockerfile 定制鏡像

      1、下面以定制一個 nginx 鏡像(構建好的鏡像內會有一個 /usr/share/nginx/html/index.html 文件)

      在一個空目錄下,新建一個名為 Dockerfile 文件,并在文件內添加以下內容:

      FROM nginx RUN echo '這是一個本地構建的nginx鏡像' > /usr/share/nginx/html/index.html

      2、FROM 和 RUN 指令的作用

      FROM:定制的鏡像都是基于 FROM 的鏡像,這里的 nginx 就是定制需要的基礎鏡像。后續的操作都是基于 nginx。

      RUN:用于執行后面跟著的命令行命令。有以下倆種格式:

      shell 格式:

      RUN <命令行命令> # <命令行命令> 等同于,在終端操作的 shell 命令。

      exec 格式:

      RUN ["可執行文件", "參數1", "參數2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline

      注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:

      FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz

      以上執行會創建 3 層鏡像??珊喕癁橐韵赂袷剑?/p>

      FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz

      如上,以 && 符號連接命令,這樣執行后,只會創建 1 層鏡像。

      開始構建鏡像

      在 Dockerfile 文件的存放目錄下,執行構建動作。

      以下示例,通過目錄下的 Dockerfile 構建一個 nginx:v3(鏡像名稱:鏡像標簽)。

      $ docker build -t nginx:v3 .

      三、其他命令詳解

      1:ENV

      設置環境變量,定義了環境變量,那么在后續的指令中,就可以使用這個環境變量。

      格式:

      ENV ENV = =...

      以下示例設置 NODE_VERSION = 7.2.0 , 在后續的指令中可以通過$NODE_VERSION 引用:

      ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

      2:COPY

      復制指令,從上下文目錄中復制文件或者目錄到容器里指定路徑。

      格式:

      COPY [--chown=:] <源路徑1>... <目標路徑> COPY [--chown=:] ["<源路徑1>",... "<目標路徑>"]

      [–chown=:]:可選參數,用戶改變復制到容器內文件的擁有者和屬組。

      <源路徑>:源文件或者源目錄,這里可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則。例如:

      COPY hom* /mydir/ COPY hom?.txt /mydir/

      <目標路徑>:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創建。

      3:ADD

      格式:ADD

      ADD ... ADD ["",... ""] 用于支持包含空格的路徑

      示例:

      ADD hom* /mydir/ # 添加所有以"hom"開頭的文件 ADD hom?.txt /mydir/ # ? 替代一個單字符,例如:"home.txt" ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

      4:EXPOSE

      格式:

      EXPOSE [...]

      示例:

      EXPOSE 80 443 EXPOSE 8080 EXPOSE 11211/tcp 11211/udp

      注:EXPOSE并不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過-p來發布這些端口,或通過-P參數來發布EXPOSE導出的所有端口

      5:USER

      格式:

      USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group

      示例:

      USER www

      注:使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構建完成后,通過docker run運行容器時,可以通過-u參數來覆蓋所指定的用戶。

      6:WORKDIR

      格式:

      WORKDIR /path/to/workdir

      【愚公系列】2022年01月 Docker容器 Dockerfile詳解

      示例:

      WORKDIR /a (這時工作目錄為/a) WORKDIR b (這時工作目錄為/a/b) WORKDIR c (這時工作目錄為/a/b/c)

      注:通過WORKDIR設置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執行。在使用docker run運行容器時,可以通過-w參數覆蓋構建時所設置的工作目錄。

      7:RUN

      RUN用于在鏡像容器中執行命令,其有以下兩種命令執行方式:

      7.1 shell執行

      格式:

      RUN

      7.2 exec執行

      格式:

      RUN ["executable", "param1", "param2"]

      示例:

      RUN ["executable", "param1", "param2"] RUN apk update RUN ["/etc/execfile", "arg1", "arg1"]

      注:RUN指令創建的中間鏡像會被緩存,并會在下次構建中使用。如果不想使用這些緩存鏡像,可以在構建時指定–no-cache參數,如:docker build --no-cache

      8:CMD

      格式:

      CMD ["executable","param1","param2"] (執行可執行文件,優先) CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數) CMD command param1 param2 (執行shell內部命令)

      示例:

      CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"]

      注:CMD不同于RUN,CMD用于指定在容器啟動時所要執行的命令,而RUN用于指定鏡像構建時所要執行的命令。

      9:ENTRYPOINT

      格式:

      ENTRYPOINT ["executable", "param1", "param2"] (可執行文件, 優先) ENTRYPOINT command param1 param2 (shell內部命令)

      示例:

      FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]

      注:ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何參數,都會被當做參數再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設置,而只執行最后的ENTRYPOINT指令。

      Docker Nginx

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Alexnet論文解讀及代碼實現
      下一篇:Django框架基礎(大型施工現場。。)
      相關文章
      亚洲日本va中文字幕久久| 亚洲精品国产福利一二区| 亚洲AV成人片色在线观看| 亚洲熟妇无码AV在线播放| 亚洲伊人成无码综合网| 亚洲人成电影在线播放| 亚洲国产a级视频| heyzo亚洲精品日韩| heyzo亚洲精品日韩| 亚洲日本一区二区一本一道| 亚洲成a人片在线观看老师| www亚洲一级视频com| 亚洲Av无码国产情品久久| 亚洲国产成人久久综合野外| 亚洲av日韩av欧v在线天堂| 亚洲第一成人影院| 亚洲精品成人在线| 中文字幕第一页亚洲| 亚洲色偷偷偷鲁综合| 久久精品国产亚洲AV麻豆~| 亚洲高清视频在线观看| 亚洲国产高清人在线| 亚洲欧洲日韩在线电影| 亚洲一区二区免费视频| 午夜在线a亚洲v天堂网2019| 亚洲精品V天堂中文字幕| 日本亚洲欧美色视频在线播放 | 亚洲一区二区中文| 亚洲综合激情九月婷婷| 亚洲国产精品乱码在线观看97| 亚洲一区二区三区免费在线观看| 亚洲一级特黄特黄的大片 | 国产亚洲大尺度无码无码专线| 亚洲午夜久久久久久久久久 | 亚洲中文字幕无码中文字| 色偷偷亚洲第一综合网| 狠狠色婷婷狠狠狠亚洲综合| 国产亚洲精品a在线观看app| 亚洲av无码国产精品夜色午夜| 久久精品九九亚洲精品| 亚洲一区二区三区免费在线观看|