通過Dockerfile文件來定制Docker鏡像

      網友投稿 775 2025-04-01

      默認的dockerFile文件名是dockerFile,不帶后綴 ,首字母大寫。


      通過Dockerfile文件構建過程是以一個鏡像為基礎,然后在其上進行定制其他東西。

      Dockerfile文件里的每一行都是Dockerfile指令。

      每一條Dockerfile命令構建一層。

      注意:Docker 不是虛擬機,容器就是進程。

      有了Dockerfile文件后只需要執行下面的命令就能構建并啟動容器了:

      ~$ sudo docker build -t myubuntu:me . //別忘了最后的那個點,表示當前目錄。 ~$ sudo docker images //查看

      1

      2

      Dockerfile 指令

      1.FROM 指令

      指定基礎鏡像,且必須是Dockerfile文件的第一條指令。指令格式:

      FROM FROM : FROM @

      1

      2

      3

      如:FROM nginx //以nginx 為基礎鏡像

      如:FROM scratch //scratch是一個空白的鏡像

      2.MAINTAINER指令

      設置維護者信息

      MAINTAINER

      1

      如:

      MAINTAINER Jasper Xu

      MAINTAINER sorex@163.com

      MAINTAINER Jasper Xu sorex@163.com

      3.RUN指令

      執行構建命令,其格式有兩種。

      格式1:shell

      RUN <命令>

      1

      如:

      RUN echo ‘

      Hello, Docker!

      ’ > /usr/share/nginx/html/index.html

      RUN apk update

      格式2:exec

      RUN ["可執行文件", "參數1", "參數2"]

      1

      如:

      RUN ["/etc/execfile", “arg1”, “arg1”]

      4.ENV 指令

      設置鏡像環境變量,在鏡像構建結束之后依舊存在鏡像中 。

      ENV ENV = ...

      1

      2

      如:

      ENV TARGET_DIR /app //ENV類似于linux的export

      使用環境變量:

      WORKDIR $TARGET_DIR

      延申:

      注意:長命令可以用“\”符號來連接。遇到幾個命令連在一起,可以用“&&”的方式連接,如上面這個命令:

      ENV myName=“John Doe” myDog=Rex\ The\ Dog \

      myCat=fluffy

      上面這條命令等同于下面

      ENV myName John Doe

      ENV myDog Rex The Dog

      ENV myCat fluffy

      5.ARG指令

      也是用于設置構建變量,與ENV類似,但ENV設置的環境變量在鏡像構建結束之后依舊存在鏡像中,而ARG則會消失。與docker build –build-arg =一樣:

      ARG =

      1

      如:

      ARG CODE_VERSION=latest

      其實有些默認參數,無需指定,就可以直接使用,如:

      HTTP_PROXY

      http_proxy

      HTTPS_PROXY

      https_proxy

      FTP_PROXY

      ftp_proxy

      NO_PROXY

      no_proxy

      6.ADD指令

      添加文件,ADD與COPY相似,ADD指令可以從一個URL下載內容并復制到容器的文件系統中,也可以將壓縮包解壓后復制到容器的文件系統中,將本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等類型的文件可以被tar -x命令解壓。用ADD構建的鏡像比用COPY的要大。

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

      1

      2

      如:

      ADD hom* /mydir/ //添加所有以"hom"開頭的文件

      ADD hom?.txt /mydir/ // ? 替代一個單字符,例如:“home.txt”

      ADD test relativeDir/ //添加 “test” 到 WORKDIR/relativeDir/

      ADD test /absoluteDir/ //添加 “test” 到 /absoluteDir/

      7.COPY指令

      將本地文件或文件夾復制到鏡像的指定路徑下。

      COPY ["<源路徑1>",... "<目標路徑>"]

      1

      如:

      COPY /Local/Path/File /ImagesPath/File

      8 .EXPOSE指令

      暴露指定端口,用于指明這個鏡像中的應用將會偵聽某個端口,并且希望能將這個端口映射到主機的網絡界面上。指定于外界交互的端口,在容器啟動時用-p傳遞參數,例如docker run -p 3307:3306 …將容器內的3306綁定到本機的3307

      EXPOSE […]

      1

      如:

      EXPOSE 80 443

      EXPOSE 8080

      9.CMD指令

      設置鏡像啟動,Dockerfile只允許使用一次CMD指令。若使用多個,則只有最后一條生效,前面的都將被抵消。CMD 指令的格式和 RUN 相似,也是兩種格式:

      格式1:shell

      CMD <命令>

      1

      格式2:exec

      CMD ["可執行文件", "參數1", "參數2"…]

      1

      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"]

      10.ENTRYPOINT指令

      設置容器接入點,使其可執行化。

      格式1:

      ENTRYPOINT ["executable", "param1", "param2"] (可執行文件, 優先)

      1

      格式2:

      ENTRYPOINT command param1 param2 (shell內部命令)

      1

      命令使用例子:

      在目錄~/Desktop/test下創建Dockerfile文件,內容如下:

      FROM ubuntu

      ENTRYPOINT [“ls”, “-s”]

      CMD ["-l"] //配合CMD用,CMD命令可省去"application"即executable可執行文件名(不需要指定),只使用參數

      構建鏡像:

      ~/Desktop/test$ sudo docker build -t haha:mama . Sending build context to Docker daemon 2.048kB Step 1/3 : From ubuntu ---> ea4c82dcd15a Step 2/3 : ENTRYPOINT ["ls","-s"] ---> Running in b0d0c16a68e8 Removing intermediate container b0d0c16a68e8 ---> 985846647a9b Step 3/3 : CMD ["-l"] ---> Running in dd8b73f52b97 Removing intermediate container dd8b73f52b97 ---> 58f8ca714eba Successfully built 58f8ca714eba Successfully tagged haha:mama wong@wong-HP-ProDesk-480-G2-MT:~/Desktop/test$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE haha mama 58f8ca714eba 12 seconds ago 85.8MB

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      創建容器

      ~/Desktop/test$ sudo docker create -it --name hahamama haha:mama e318527e4bb33fdce39edd3841252f0907631940cebe0213ee0384fed52b8a45

      1

      2

      3

      啟動容器

      ~/Desktop/test$ sudo docker start -a -i hahamama total 64 4 drwxr-xr-x 2 root root 4096 Oct 18 21:03 bin 4 drwxr-xr-x 2 root root 4096 Apr 24 2018 boot 0 drwxr-xr-x 5 root root 360 Mar 12 04:07 dev 4 drwxr-xr-x 1 root root 4096 Mar 12 04:07 etc 4 drwxr-xr-x 2 root root 4096 Apr 24 2018 home 4 drwxr-xr-x 8 root root 4096 Oct 18 21:02 lib 4 drwxr-xr-x 2 root root 4096 Oct 18 21:02 lib64 4 drwxr-xr-x 2 root root 4096 Oct 18 21:02 media 4 drwxr-xr-x 2 root root 4096 Oct 18 21:02 mnt 4 drwxr-xr-x 2 root root 4096 Oct 18 21:02 opt 0 dr-xr-xr-x 303 root root 0 Mar 12 04:07 proc 4 drwx------ 2 root root 4096 Oct 18 21:03 root 4 drwxr-xr-x 1 root root 4096 Oct 19 00:47 run 4 drwxr-xr-x 1 root root 4096 Oct 19 00:47 sbin 4 drwxr-xr-x 2 root root 4096 Oct 18 21:02 srv 0 dr-xr-xr-x 13 root root 0 Mar 12 04:07 sys 4 drwxrwxrwt 2 root root 4096 Oct 18 21:03 tmp 4 drwxr-xr-x 1 root root 4096 Oct 18 21:02 usr 4 drwxr-xr-x 1 root root 4096 Oct 18 21:03 var

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      瞧!容器一啟動就執行了ls -s -l這個shell命令。

      但是很可惜,一啟動完輸入以上信息后,容器也停了。所以不建議使用ENTRYPOINT指令。

      11.VOLUME指令

      設置數據卷,用于指定持久化目錄,向基于鏡像創建的容器添加數據卷(在容器中設置一個掛載點,可以用來讓其他容器掛載或讓宿主機訪問,以實現數據共享或對容器數據的備份、恢復或遷移)。數據卷可以在容器間共享和重用,數據卷的修改是立即生效的,數據卷的修改不會對更新鏡像產生影響。數據卷會一直存在,直到沒有任何容器使用它(沒有容器使用的,它也會存在于宿主機上,只是此時和普通文件一樣。)

      可以通過命令在創建容器時用-v創建數據卷,如:

      sudo docker create -it --name myContainer -v /hostVol:/ContainerV myv:2018 bash

      也可以通過如下命令創建數據卷(不建議用這種方式):

      sudo docker run -v ~/opt/data/mysql:/var/lib/mysql container // 將宿主機~/opt/data/mysql和容器內的/var/lib/mysql做持久化關聯,容器啟動時會加載,容器關閉后會回寫。

      dockerfile中只能指定容器中的路徑

      使用方法如下:

      VOLUME ["/data"] VOLUME ["/data"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

      1

      2

      3

      一個小實例:

      在目錄~/Desktop/test下創建Dockerfile文件,內容如下

      From ubuntu VOLUME ["/wong/folder1","/wong/folder2","/wong/folder3"] VOLUME "/wong/haha"

      1

      2

      3

      構建鏡像

      ~/Desktop/test$ sudo docker build . -t haha:2019 Sending build context to Docker daemon 2.048kB Step 1/3 : From ubuntu ---> ea4c82dcd15a Step 2/3 : VOLUME ["/wong/folder1","/wong/folder2","/wong/folder3"] ---> Running in 97682b2376c0 Removing intermediate container 97682b2376c0 ---> ba1e74e3af36 Step 3/3 : VOLUME "/wong/haha" ---> Running in cea037f06ff3 Removing intermediate container cea037f06ff3 ---> 31a88002ab49 Successfully built 31a88002ab49 Successfully tagged haha:2019

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      利用構建出來的鏡像創建容器

      ~/Desktop/test$ sudo docker create -it --name haha2019 haha:2019 bash ce71292add38fa529bb23d08b380e9de50a437709af6c13ace54ec18f8ac1335

      1

      2

      運行容器

      ~/Desktop/test$ sudo docker start -a -i haha2019

      1

      在容器上看創建的數據卷目錄

      root@ce71292add38:/wong# ls folder1 folder2 folder3 haha

      1

      通過Dockerfile文件來定制Docker鏡像

      2

      查看docker實例的數據卷配置信息

      可以清楚看到容器的數據卷與宿主機上的相應目錄的對應關系。

      ~$ sudo docker inspect haha2019 | grep -A 41 Mounts "Mounts": [ { "Type": "volume", "Name": "00f2086ccd364f670195b2596fdad84a91621d10a5382b487675074dce7a2296", "Source": "/var/lib/docker/volumes/00f2086ccd364f670195b2596fdad84a91621d10a5382b487675074dce7a2296/_data", "Destination": "/wong/haha", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "3fe567723e348f942588ae5cdec57da99441d332ff5637f87343dffd518b03ab", "Source": "/var/lib/docker/volumes/3fe567723e348f942588ae5cdec57da99441d332ff5637f87343dffd518b03ab/_data", "Destination": "/wong/folder1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "509b7466faa23da3803aae40004d8ed88bd0e74c954374ea6c66f139463a0452", "Source": "/var/lib/docker/volumes/509b7466faa23da3803aae40004d8ed88bd0e74c954374ea6c66f139463a0452/_data", "Destination": "/wong/folder2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "2199971d80e01b186ee533c53ef00e755d0e7a71e21797e505a2f3e2af8d7049", "Source": "/var/lib/docker/volumes/2199971d80e01b186ee533c53ef00e755d0e7a71e21797e505a2f3e2af8d7049/_data", "Destination": "/wong/folder3", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      在容器上創建一個文件測試一下:

      root@ce71292add38:/wong# cd haha root@ce71292add38:/wong/haha# echo "hello world" > ht.txt root@ce71292add38:/wong/haha# ls ht.txt

      1

      2

      3

      4

      根據前面得到的docker的配置信息,查看在宿主機上的文件

      ~$ su root Password: root@wong-HP-ProDesk-480-G2-MT:/home/wong# cd /var/lib/docker/volumes/00f2086ccd364f670195b2596fdad84a91621d10a5382b487675074dce7a2296/_data root@wong-HP-ProDesk-480-G2-MT:/var/lib/docker/volumes/00f2086ccd364f670195b2596fdad84a91621d10a5382b487675074dce7a2296/_data# ls ht.txt root@wong-HP-ProDesk-480-G2-MT:/var/lib/docker/volumes/00f2086ccd364f670195b2596fdad84a91621d10a5382b487675074dce7a2296/_data# cat ht.txt hello world

      1

      2

      3

      4

      5

      6

      7

      注意:Dockerfile中只能指定容器中的路徑

      12 .USER指令

      設置構建用戶,指定運行容器時的用戶名或UID(默認為root),RUN, CMD 、 ENTRYPOINT都將用該用戶執行。可以用docker run -u選項來覆蓋。

      USER user USER user:group USER uid:gid

      1

      2

      3

      指定的用戶需要在USER指令之前創建:

      RUN groupadd -r newuser && -r -g newuser newuser USER newuser

      1

      2

      13.WORKDIR指令

      設置工具目錄,Dockerfile中的WORKDIR指令用于指定容器的一個目錄,容器啟動時執行的命令會在該目錄下執行,指定了指定RUN、CMD、ENTERYPOINT命令的工作目錄。通過一個實例來講解:

      在~/Desktop/test/目錄下創建一個Dockerfile文件,內容如下:

      FROM ubuntu MAINTAINER hello RUN mkdir /mydir && echo hello world > /mydir/test.txt WORKDIR /mydir CMD ["more" ,"test.txt"]

      1

      2

      3

      4

      5

      構建鏡像

      ~/Desktop/test$ sudo docker build . -t hello:2019 [sudo] password for wong: Sending build context to Docker daemon 14.85kB Step 1/5 : From ubuntu ---> ea4c82dcd15a Step 2/5 : MAINTAINER wongkyunban ---> Running in 25583fe9afb3 Removing intermediate container 25583fe9afb3 ---> 59ca2e940204 Step 3/5 : RUN mkdir /workspace && echo "hello world" > /workspace/hello.txt ---> Running in 66cc630275cd Removing intermediate container 66cc630275cd ---> eb144d163ffb Step 4/5 : WORKDIR /workspace ---> Running in 7ea79f4611d1 Removing intermediate container 7ea79f4611d1 ---> a52b4a7f79f4 Step 5/5 : CMD ["more","hello.txt"] ---> Running in bf81ea9073c5 Removing intermediate container bf81ea9073c5 ---> 1cdc460f1bb9 Successfully built 1cdc460f1bb9 Successfully tagged hello:2019

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      創建容器

      ~/Desktop/test$ sudo docker create -it --name hello2019 hello:2019 bash a9d93f4fde2757eece21914f1a172c85e8fc5d1ef68c5ccafa4fb3fe432907af

      1

      2

      啟動容器

      wong@wong-HP-ProDesk-480-G2-MT:~/Desktop/test$ sudo docker start -a -i hello2019 root@a9d93f4fde27:/workspace#

      1

      2

      3

      4

      沒有指定工作目錄的容器啟動后是這樣的:

      root@ce71292add38:/#

      1

      我們可以看到一啟動容器后,工作目錄由“/”變為了“/workspace”。

      我們從其他三種運行方式運行一下我們的鏡像:

      第一種:

      ~/Desktop/test$ sudo docker run hello:2019 :::::::::::::: hello.txt :::::::::::::: hello world

      1

      2

      3

      4

      5

      6

      第二種:

      ~/Desktop/test$ sudo docker run hello:2019 more hello.txt :::::::::::::: hello.txt :::::::::::::: hello world

      1

      2

      3

      4

      5

      6

      可以看到兩種方式都輸出同樣的東西,可以看出,more的參數是hello.txt,但沒有指定路徑卻能成功,說明當前路徑就是上面WORKDIR指令設置的。

      如果我們在上面的Dockerfile中把WORKDIR指令去掉,創建容器運行會報文件不存在錯誤。

      可以在docker run命令中用-w參數覆蓋掉WORKDIR指令的設置,如:

      ~/Desktop/test$ sudo docker run -w / hello:2019 more: stat of hello.txt failed: No such file or directory

      1

      2

      上面的-w參數把容器的工作目錄設置成了根目錄,而根目錄下沒有hello.txt文件。所以結果顯示:

      more: stat of hello.txt failed: No such file or directory。

      可以使用多個WORKDIR指令,后續命令的參數是相對路徑,則會基于之前的命令指定的路徑,如

      WORKDIR /a WORKDIR b WORKDIR c

      1

      2

      3

      則最終路徑為/a/b/c

      14.LABEL指令

      設置元數據,給鏡像添加信息。使用docker inspect可查看鏡像的相關信息,標簽信息會保存到鏡像中,如果某個值已經存在,新的標簽元素會覆蓋它。

      LABEL =<”value”>

      如:

      LABEL “com.example.vendor”=“ACME Incorporated”

      LABEL com.example.label-with-value=“foo”

      LABEL version=“1.0”

      LABEL description=“This text illustrates

      that label-values can span multiple lines.”

      在~/Desktop/test/目錄下創建一個Dockerfile文件,內容如下:

      From ubuntu LABEL "HELLO_WORLD"="This is me!" RUN mkdir /workspace && echo "hello world" > /workspace/hello.txt WORKDIR /workspace CMD ["more","hello.txt"]

      1

      2

      3

      4

      5

      6

      構建鏡像:

      ~/Desktop/test$ sudo docker build . -t hatest:2019

      1

      2

      使用docker inspect查看鏡像信息

      ~/Desktop/test$ sudo docker inspect hatest:2019 | grep -A 10 Labels "Labels": { "HELLO_WORLD": "This is me!" }

      1

      2

      3

      4

      5

      15 .STOPSIGNAL指令

      設置停止信號STOPSIGNAL SIGKILL ,當啟動的容器在停止時,就會發送SIGKILL信號

      STOPSIGNAL指令設置系統調用信號,當容器退出時,系統就會把信號發給容器。這個信號可以是合法的unsigned類型的整數,這個整數對應著內核系統調用表的索引。例如9, 或者用一個信號名如SIGKILL。

      Dockerfile可以這么寫

      From ubuntu STOPSIGNAL SIGKILL

      1

      2

      3

      16.HEALTHCHECK指令

      檢查鏡像狀態,檢查容器啟動運行時是否正常

      HEALTHCHECK [OPTIONS] CMD command

      1

      如:

      檢查容器的CMD指令運行是否正常

      HEALTHCHECK –interval=5m –timeout=3s \ CMD curl -f http://localhost/ || exit 1

      1

      2

      17.SHELL指令

      設置命令執行環境。默認使用/bin/sh作為shell環境。

      SHELL ["executable", "parameters"]

      1

      如:

      SHELL ["powershell", "-command"] RUN Execute-MyCmdlet -param1 "c:\foo.txt"

      1

      2

      3

      等價于

      powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"

      1

      Docker 容器 鏡像服務

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

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

      上一篇:excel表導入sql數據庫的教程
      下一篇:制造商和生產商的區別(制造商與生產商的區別是什么)
      相關文章
      亚洲精品色婷婷在线影院| 亚洲国产精品免费在线观看| 亚洲中文字幕AV每天更新| 亚洲中文字幕无码不卡电影| 久久99亚洲综合精品首页| 久久久久亚洲爆乳少妇无| 亚洲无码精品浪潮| 亚洲精品WWW久久久久久| 亚洲国产一区明星换脸| 亚洲精品无码专区久久同性男| 亚洲综合精品网站在线观看| 国产亚洲精品拍拍拍拍拍| 中文字幕在线亚洲精品| 亚洲精品乱码久久久久久蜜桃不卡| 伊人久久大香线蕉亚洲五月天| 亚洲熟妇无码另类久久久| 国产偷v国产偷v亚洲高清| 亚洲国产精品VA在线看黑人| 国产亚洲色婷婷久久99精品| 久久亚洲精品成人777大小说| 亚洲午夜精品久久久久久人妖| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲国产精品成人| 亚洲中文无韩国r级电影| 日韩一卡2卡3卡4卡新区亚洲| 亚洲精品字幕在线观看| 亚洲国产精品第一区二区| 亚洲福利一区二区三区| 国产精品亚洲精品观看不卡| 亚洲色大成网站www永久男同| 亚洲AV网一区二区三区| 亚洲日韩在线观看| 国产亚洲一区二区三区在线| 久久精品亚洲一区二区三区浴池| 亚洲国产精品xo在线观看| 亚洲人成未满十八禁网站| 亚洲AV中文无码乱人伦| 亚洲精品无码午夜福利中文字幕 | 亚洲精品专区在线观看| 国产∨亚洲V天堂无码久久久| 亚洲综合久久综合激情久久|