Docker基础(4)——Dockerfile书写
Docker中制作镜像一共有两个方法:
1. 基于容器制作镜像:
docker commit …
2. 基于Dockerfile制作镜像;
docker build …
Dockerfile的制作步骤:
1.创建一个目录;
2.在目录中创建一个首字母大写的文件,供docker build识别;
3.因为Dockerfile的执行环境在创建的目录中,所以可以创建相对应的文件,供dockerfile使用;
ex:
[root@master ~]# ls docimageDockerfile index.html [root@master ~]# cat docimage/DockerfileFROM 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
2.LABEL(写入当前Dockerfile的制作者信息);
LABEL
3.COPY(将宿主机的文件拷贝至镜像中);
COPY
注意:在路径中有空白字符时,通常使用第二种格式;
4.ADD(类似于COPY指令,支持TAR文件和URL路径);
ADD
注意:
如果
如果
如果
5.WORKDIR(用于为Dockerfile中所有的RUN, CMD, ENTRYPOINT, COPY和ADD指定设定工作目录;);
WORKDIR
在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径;
另外,WORKDIR也可以调用有ENV指定定义的变量;
6.VOLUME(用于在image中创建一个挂载点目录,可以用于在Docker Host上挂载卷);
VOLUME
个人并不建议使用:这是Docker daemon创建托管卷,并不是绑定挂载;
7.EXPOSE(为容器打开要监听的端口,实现与外部的通信);
EXPOSE
8.ENV(为镜像定义环境变量,可以被其他指令调用,build_time和run_time都可被使用);
ENV
调用格式:
$variable_name或${variable_name}
9.ARG (在创建镜像是build_time使用的变量,一般用ARG写版本号和作者);
ARG
10.RUN(用于指定Docker build过程中运行的程序);
RUN
RUN ["
11.CMD(类似于RUN命令,在run_time执行);
CMD
CMD ["
CMD ["
12.ENTRYPOINT(类似于CMD指令)
ENTRYPOINT
ENTRYPOINT ["
[root@master ~]# cat docimage1/entrypoint.sh#!/bin/sh exec $@[root@master ~]# cat docimage1/DockerfileFROM 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
命令执行图
创建一个Dockerfile;
[root@www ~]# mkdir docimage[root@www ~]# vim docimage/Dockerfile[root@www ~]#[root@www ~]# vim docimage/test.txt[root@www ~]# cat docimage/DockerfileFROM 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.txtTHIS is Docker TEST;
用Dockerfile创建镜像:
[root@www ~]# docker build docimage/ -t ljymyy/nginx:v0.2Sending build context to Docker daemon 3.072kBStep 1/7 : FROM nginx:1.14-alpine ---> 77bae8d00654Step 2/7 : LABEL maintainer="liujingyu" ---> Using cache ---> a012ac4c6f51Step 3/7 : ENV DOC_ROOT="/tmp" VOLUME_ROOT=/data/mydata ---> Using cache ---> ee6ed363bfdeStep 4/7 : COPY test.txt ${DOC_ROOT} ---> Using cache ---> a416671fde2aStep 5/7 : VOLUME ${VOLUME_ROOT} ---> Using cache ---> 84bf38b22301Step 6/7 : RUN echo 123 > ${DOC_ROOT}/test.txt ---> Using cache ---> 756cd9857096Step 7/7 : CMD cat ${DOC_ROOT}/test.txt ---> Running in a2f99fcc5fbaRemoving intermediate container a2f99fcc5fba ---> dac468a636e0Successfully built dac468a636e0Successfully tagged ljymyy/nginx:v0.2[root@www ~]# docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEljymyy/nginx v0.2 dac468a636e0 2 minutes ago 17.7MB
运行此镜像:
[root@www ~]# docker container run --rm --name ngx1 ljymyy/nginx:v0.2123