Docker基础(4)——Dockerfile书写
admin
2023-02-05 13:40:04
0次

Docker中制作镜像一共有两个方法:

1.     基于容器制作镜像:

docker commit …

2.     基于Dockerfile制作镜像;

docker build …

 

Dockerfile的制作步骤:

       1.创建一个目录;

       2.在目录中创建一个首字母大写的文件,供docker build识别;

       3.因为Dockerfile的执行环境在创建的目录中,所以可以创建相对应的文件,供dockerfile使用;

       ex:

[root@master ~]# ls docimage
Dockerfile  index.html       
[root@master ~]# cat docimage/Dockerfile
FROM busybox:latest
 
LABEL maintainer="hevttc"
 
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 |: 或

FROM @

:指定作为base image的名称;

:base image的标签,为可选项,省略时默认为latest;

 

2.LABEL(写入当前Dockerfile的制作者信息);

LABEL = = = …

 

3.COPY(将宿主机的文件拷贝至镜像中);

COPY … 或COPY ["",... "" ]

:要复制的源文件或目录,支持使用通配符;

:目标路径,即正在创建的image的文件系统路径;建议为使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径;

注意:在路径中有空白字符时,通常使用第二种格式;

 

4.ADD(类似于COPY指令,支持TAR文件和URL路径);

ADD … 或ADD ["",... "" ]

 

注意:

如果为URL且不以"/"结尾,则指定的文件将被下载并直接被创建为;如果以"/"结尾,则文件名URL指定的文件将被下载并保存为/;

如果是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于"tar -x"命令;然而,通过URL获取到的tar文件将不会被自动展开;

如果有多个,或其间接或直接使用了通配符,则必须是一个以"/"结尾的目录路径;如果不以"/"结尾,则其被视作一个普通文件,的内容将被直接写入到;

 

5.WORKDIR(用于为Dockerfile中所有的RUN, CMD, ENTRYPOINT, COPY和ADD指定设定工作目录;);

WORKDIR

在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径;

另外,WORKDIR也可以调用有ENV指定定义的变量;

 

6.VOLUME(用于在image中创建一个挂载点目录,可以用于在Docker Host上挂载卷);

VOLUME 或 VOLUME ["mountpoint"]

       个人并不建议使用:这是Docker daemon创建托管卷,并不是绑定挂载;

 

7.EXPOSE(为容器打开要监听的端口,实现与外部的通信);

       EXPOSE [/] [/] [/] …

              用于指定传输层协议,可为TCP或UDP二者之一,默认为TCP;

 

8.ENV(为镜像定义环境变量,可以被其他指令调用,build_time和run_time都可被使用);

ENV 或 ENV =...

       调用格式:

       $variable_name或${variable_name}

 

9.ARG (在创建镜像是build_time使用的变量,一般用ARG写版本号和作者);

ARG [=]

 

10.RUN(用于指定Docker build过程中运行的程序);

RUN 或

RUN ["","","",...](json数组)

 

11.CMD(类似于RUN命令,在run_time执行);

CMD 或

CMD ["","","",...] 或

CMD ["","",...] (为ENTRYPOINT指令提供默认参数)

 

12.ENTRYPOINT(类似于CMD指令)

ENTRYPOINT

ENTRYPOINT ["","","",...]

 

[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

 

命令执行图

Docker基础(4)——Dockerfile书写

创建一个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"
 
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"
 ---> 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



相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...