<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          阿里華為Dockerfile命令規(guī)范及最佳實(shí)踐

          共 3246字,需瀏覽 7分鐘

           ·

          2020-12-20 11:52

          0 什么是 Dockerfile?

          Dockerfile 是一個(gè)用來(lái)構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說(shuō)明。

          1 ?FROM

          定制的鏡像都是基于 FROM 的鏡像,后續(xù)的操作都是基于該 image。

          • FROM scratch
            制作base image

          • FROM centos
            使用base image

          • FROM ubuntu:14.04

          最佳實(shí)踐

          考慮安全性,請(qǐng)盡量使用官方 image 作為 base image。

          2 LABEL

          LABEL maintainer= "[email protected]'
          LABEL version="1.O"
          LABEL description="This is a description"

          最佳實(shí)踐

          這就像代碼的注釋,必須寫好元數(shù)據(jù)。

          3 RUN

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

          Shell格式

          RUN apt-get install -y vim
          CMD echo "hello docker"
          ENTRYPOINT echo "hello docker"
          • Dockerfile
          docker build -t javaedge/centos-shell .

          docker image ls
          docker run javaedge/centos-shell

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

          Exec 格式

          RUN [ "apt-get" , "install" , "-y", "vim" ]
          CMD [ " /bin/echo" , "hello docker" ]
          ENTRYPOINT [ "/bin/echo" , "hello docker" ]
          • Dockerfile2

          • 那如何修改才能讓 exec 格式的命令能被 shell 識(shí)別呢,修正:

            RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
            # 例如:
            # RUN ["./test.php", "dev", "offline"] 等價(jià)于 RUN ./test.php dev offline
          RUN yum update && yum install -y vim \
              python-dev  # 反斜線換行RUN apt-get update && apt-get install -y perl \
              pwgen --no-install-recommends && rm -rf \
              /var/lib/apt/lists/* # 注意清理cacheRUN /bin/bash -C 'source $HOME/.bashrc; echo
          $HOME'

          Dockerfile 的指令每執(zhí)行一次都會(huì)在 docker 上新建一層。所以過(guò)多無(wú)意義的層,會(huì)造成鏡像膨脹過(guò)大。例如:

          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
          以上執(zhí)行會(huì)創(chuàng)建 3 層鏡像。可簡(jiǎn)化為以下格式:
          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

          如上,以 && 符號(hào)連接命令,這樣執(zhí)行后,只會(huì)創(chuàng)建 1 層鏡像。

          最佳實(shí)踐

          • 可讀性
            復(fù)雜RUN用反斜線換行
          • 避免無(wú)用分層
            合并多條命令成一行

          4 WORKDIR

          類似 linux 的cd 命令。

          WORKDIR /test # 如果沒(méi)有會(huì)自動(dòng)創(chuàng)建test目錄
          WORKDIR demo
          RUN pwd # 輸出結(jié)果應(yīng)為/test/demo

          最佳實(shí)踐

          使用WORKDIR,不要用 RUN cd
          盡量使用絕對(duì)目錄而非相對(duì)目錄。

          5 ADD & COPY

          COPY

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

          格式:

          COPY [--chown=:] <源路徑1>...  <目標(biāo)路徑>
          COPY [--chown=:] ["<源路徑1>",...  "<目標(biāo)路徑>"]

          [--chown=:]:可選參數(shù),用戶改變復(fù)制到容器內(nèi)文件的擁有者和屬組。

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

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

          <目標(biāo)路徑>:容器內(nèi)的指定路徑,該路徑不用事先建好,路徑不存在的話,會(huì)自動(dòng)創(chuàng)建。

          ADD

          ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)。功能也類似,區(qū)別:

          • ADD 的優(yōu)點(diǎn)
            在執(zhí)行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會(huì)自動(dòng)復(fù)制并解壓到 <目標(biāo)路徑>。
          • ADD 的缺點(diǎn)
            在不解壓的前提下,無(wú)法復(fù)制 tar 壓縮文件。會(huì)令鏡像構(gòu)建緩存失效,從而可能會(huì)令鏡像構(gòu)建變得比較緩慢。具體是否使用,可以根據(jù)是否需要自動(dòng)解壓來(lái)決定。
          ADD hello /
          
          # 添加到根目錄并解壓
          ADD test.tar.gz / 
          
          WORKDIR /root
          ADD hello test/  # /root/test/hello
          
          WORKDIR /root
          COPY hello test/

          最佳實(shí)踐

          大部分情況,COPY優(yōu)先于ADD
          ADD比COPY多個(gè)解壓功能
          添加遠(yuǎn)程文件/目錄請(qǐng)使用curl或者wget

          6 ENV

          ENV MYSQL VERSION 5.6 # 設(shè)置常量RUN apt-get install -y mysql-server= "$(MYSQL_VERSION]" \
              && rm -rf /var/lib/apt/lists/* # 引用常量

          最佳實(shí)踐

          盡量使用,可增加項(xiàng)目的可維護(hù)性。

          7 上下文路徑

          指令最后一個(gè) . 是上下文路徑

          • 上下文路徑
            指 docker 在構(gòu)建鏡像,有時(shí)候想要使用到本機(jī)的文件(比如復(fù)制),docker build 命令得知這個(gè)路徑后,會(huì)將路徑下的所有內(nèi)容打包。

          由于 docker 的運(yùn)行模式是 C/S。我們本機(jī)是 C,docker 引擎是 S。實(shí)際的構(gòu)建過(guò)程是在 docker 引擎下完成的,所以這個(gè)時(shí)候無(wú)法用到我們本機(jī)的文件。這就需要把我們本機(jī)的指定目錄下的文件一起打包提供給 docker 引擎使用。
          如果未說(shuō)明最后一個(gè)參數(shù),那么默認(rèn)上下文路徑就是 Dockerfile 所在的位置。

          上下文路徑下不要放無(wú)用的文件,因?yàn)闀?huì)一起打包發(fā)送給 docker 引擎,如果文件過(guò)多會(huì)造成過(guò)程緩慢。

          VOLUME & EXPOSE

          存儲(chǔ)和網(wǎng)絡(luò)

          CMD & ENTRYPOINT

          實(shí)戰(zhàn)

          • 項(xiàng)目源碼
          • python app.py

            如何調(diào)試Dockerfile?

          • 比如執(zhí)行到如下步驟時(shí)報(bào)錯(cuò)

            那就進(jìn)入該臨時(shí)中轉(zhuǎn)鏡像即可
          docker run -it 4320f8b526bc /bin/bash

          進(jìn)入后,直接查看 app,原來(lái)是個(gè)文件,并非路徑!檢查下 Dockerfile

          注意那行意思是將 app.py 放到根目錄下并命名為 app,所以它不是個(gè)目錄。

          之后再 build,run 即可。

          參考

          • 更多最佳實(shí)踐,盡在官方 Dockerfile 文件
            https://github.com/docker-library
            https://docs.docker.com/engine/reference/builder/
          瀏覽 51
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲欧美综合 | 想操逼| 豆花网站高清无码18 | 亚洲国产永久精品成人麻豆 | 18毛片|