Docker基礎(4)——Dockerfile書寫

Docker中製做鏡像一共有兩個方法:html

1.     基於容器製做鏡像:nginx

docker commit …docker

2.     基於Dockerfile製做鏡像;json

docker build …vim

 

Dockerfile的製做步驟:數組

       1.建立一個目錄;bash

       2.在目錄中建立一個首字母大寫的文件,供docker build識別;ide

       3.由於Dockerfile的執行環境在建立的目錄中,因此能夠建立相對應的文件,供dockerfile使用;ui

       ex:spa

[root@master ~]# ls docimage
Dockerfile  index.html       
[root@master ~]# cat docimage/Dockerfile
FROM busybox:latest
 
LABEL maintainer="hevttc<ljy@163.com>"
 
ENV DOC_ROOT="/tmp/" \
              VOLUME_ROOT="/data/mydata" \
              ARGU="/usr/sbin/"
 
COPY index.html /tmp/
 
VOLUME ${VOLUME_ROOT}
 
RUN ifconfig -a && \
              cat ${DOC_ROOT}index.html

 

 

 

Dockerfile書寫格式

Dockerfile Format

「#」開頭的行是註釋行(能夠多行,任意位置);

INSTRUCTION arguments

指令和對應的參數,建議指令大寫,參數小寫,默認大小寫都可;

能用一行指令完成,儘可能不用多行指令;

第一行可執行指令必須是FROM指令;

Docker是順序執行Dockerfile中的內容,注意書寫順序;

 

Dockerfile中幾個重要的指令:

1.FROM (指定基準鏡像)

FROM <repository>|:<tag> 或

FROM <repository>@<digest>

<repository>:指定做爲base image的名稱;

<tag>:base image的標籤,爲可選項,省略時默認爲latest;

 

2.LABEL(寫入當前Dockerfile的製做者信息);

LABEL <key>=<value> <key>=<value> <key>=<value> …

 

3.COPY(將宿主機的文件拷貝至鏡像中);

COPY <src> … <dest> 或COPY ["<src>",... "<dest>" ]

<src>:要複製的源文件或目錄,支持使用通配符;

<dest>:目標路徑,即正在建立的image的文件系統路徑;建議爲<dest>使用絕對路徑,不然,COPY指定則以WORKDIR爲其起始路徑;

注意:在路徑中有空白字符時,一般使用第二種格式;

 

4.ADD(相似於COPY指令,支持TAR文件和URL路徑);

ADD <src> … <dest> 或ADD ["<src>",... "<dest>" ]

 

注意:

若是<src>爲URL且<dest>不以"/"結尾,則<src>指定的文件將被下載並直接被建立爲<dest>;若是<dest>以"/"結尾,則文件名URL指定的文件將被下載並保存爲<dest>/<filename>;

若是<src>是一個本地系統上的壓縮格式的tar文件,它將被展開爲一個目錄,其行爲相似於"tar -x"命令;然而,經過URL獲取到的tar文件將不會被自動展開;

若是<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以"/"結尾的目錄路徑;若是<dest>不以"/"結尾,則其被視做一個普通文件,<src>的內容將被直接寫入到<dest>;

 

5.WORKDIR(用於爲Dockerfile中全部的RUN, CMD, ENTRYPOINT, COPY和ADD指定設定工做目錄;);

WORKDIR <dirpath>

在Dockerfile文件中,WORKDIR指令可出現屢次,其路徑也能夠爲相對路徑,不過,其是相對此前一個WORKDIR指令指定的路徑;

另外,WORKDIR也能夠調用有ENV指定定義的變量;

 

6.VOLUME(用於在image中建立一個掛載點目錄,能夠用於在Docker Host上掛載卷);

VOLUME <mountpoint> 或 VOLUME ["mountpoint"]

       我的並不建議使用:這是Docker daemon建立託管卷,並非綁定掛載;

 

7.EXPOSE(爲容器打開要監聽的端口,實現與外部的通訊);

       EXPOSE <port>[/<protocol>] <port>[/<protocol>] <port>[/<protocol>] …

              <protocol>用於指定傳輸層協議,可爲TCP或UDP兩者之一,默認爲TCP;

 

8.ENV(爲鏡像定義環境變量,能夠被其餘指令調用,build_time和run_time均可被使用);

ENV <key> <value> 或 ENV <key>=<value>...

       調用格式:

       $variable_name或${variable_name}

 

9.ARG (在建立鏡像是build_time使用的變量,通常用ARG寫版本號和做者);

ARG <name>[=<default value>]

 

10.RUN(用於指定Docker build過程當中運行的程序);

RUN <command> 或

RUN ["<excutable>","<param1>","<param2>",...](json數組)

 

11.CMD(相似於RUN命令,在run_time執行);

CMD <command> 或

CMD ["<excutable>","<param1>","<param2>",...] 或

CMD ["<param1>","<param2>",...] (爲ENTRYPOINT指令提供默認參數)

 

12.ENTRYPOINT(相似於CMD指令)

ENTRYPOINT <command>

ENTRYPOINT ["<excutable>","<param1>","<param2>",...]

 

[root@master ~]# cat docimage1/entrypoint.sh
#!/bin/sh
 
exec $@
[root@master ~]# cat docimage1/Dockerfile
FROM nginx:1.14-alpine
 
COPY entrypoint.sh /bin/
 
CMD ["/usr/local/nginx","-g","daemon off;"]
 
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@master ~]# ll docimage1/
總用量 8
-rw-r--r-- 1 root root 129 11月  1 20:42 Dockerfile
-rwxr-xr-x 1 root root  19 11月  1 20:16 entrypoint.sh

 

命令執行圖

image.png

建立一個Dockerfile;

[root@www ~]# mkdir docimage
[root@www ~]# vim docimage/Dockerfile
[root@www ~]#
[root@www ~]# vim docimage/test.txt
[root@www ~]# cat docimage/Dockerfile
FROM nginx:1.14-alpine
 
LABEL maintainer="liujingyu<ljy_153@163.com>"
 
ENV DOC_ROOT="/tmp" \
              VOLUME_ROOT=/data/mydata
 
COPY test.txt ${DOC_ROOT}
 
VOLUME ${VOLUME_ROOT}
 
RUN echo 123 > ${DOC_ROOT}/test.txt
 
CMD cat ${DOC_ROOT}/test.txt
[root@www ~]#
[root@www ~]# cat docimage/test.txt
THIS is Docker TEST;


用Dockerfile建立鏡像:

[root@www ~]# docker build docimage/ -t ljymyy/nginx:v0.2
Sending build context to Docker daemon  3.072kB
Step 1/7 : FROM nginx:1.14-alpine
 ---> 77bae8d00654
Step 2/7 : LABEL maintainer="liujingyu<ljy_153@163.com>"
 ---> Using cache
 ---> a012ac4c6f51
Step 3/7 : ENV DOC_ROOT="/tmp"         VOLUME_ROOT=/data/mydata
 ---> Using cache
 ---> ee6ed363bfde
Step 4/7 : COPY test.txt ${DOC_ROOT}
 ---> Using cache
 ---> a416671fde2a
Step 5/7 : VOLUME ${VOLUME_ROOT}
 ---> Using cache
 ---> 84bf38b22301
Step 6/7 : RUN echo 123 > ${DOC_ROOT}/test.txt
 ---> Using cache
 ---> 756cd9857096
Step 7/7 : CMD cat ${DOC_ROOT}/test.txt
 ---> Running in a2f99fcc5fba
Removing intermediate container a2f99fcc5fba
 ---> dac468a636e0
Successfully built dac468a636e0
Successfully tagged ljymyy/nginx:v0.2
[root@www ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ljymyy/nginx        v0.2                dac468a636e0        2 minutes ago       17.7MB

運行此鏡像:

[root@www ~]# docker container  run --rm  --name ngx1 ljymyy/nginx:v0.2
123
相關文章
相關標籤/搜索