七、Docker File
- .dockeringore:打包忽略的文件列表,每行写一个文件的路径,可使用通配符
- FROM指令:指定基础镜像
FROM[: ] or FROM @
~]# mkdir img_work #创建工作目录~]# cd img_work/img_work]# vim Dockerfile #注意D大写# Description: my image #描述信息FROM centos:centos7.5.1804 #基础镜像LABEL maintainer="Dongfei" #元数据
- COPY指令:
COPY ["",..." "] 1. 必须是build上下午中的路径,不能是父目录中的文件 2.如果 是目录,则其内部文件或子目录会被递归复制,但 目录本身不会被复制 3.如果指定多个 ,或在 中使用了通配符,则 必须是一个目录,且必须以/结尾 4.如果 事先不存在,它将会被自动创建,这包括其父目录
# 复制网页文件img_work]# vim DockerfileCOPY ["index.html","/var/www/html/"]img_work]# vim index.htmlMy Docker website.
img_work]# docker build -t tinyhttpd:v0.1 ./img_work]# docker run --name h1 --rm tinyhttpd:v0.1 cat /var/www/html/index.htmlMy Docker website.
# 复制yum源img_work]# cp -r /etc/yum.repos.d/ ./img_work]# vim DockerfileCOPY ["yum.repos.d/","/etc/yum.repos.d/"]img_work]# docker build -t tinyhttpd:v0.2 ./ img_work]# docker run --name h2 --rm tinyhttpd:v0.2 ls /etc/yum.repos.d/
- ADD指令:将宿主机的文件打包到docker镜像,支持URL和tar文件
ADD ["",..." "] 1. 如果是本地的tar文件,则会自动展开至镜像中 2. 如果是URL的tar文件,则不会自动展开
img_work]# wget http://nginx.org/download/nginx-1.16.0.tar.gzimg_work]# vim DockerfileADD ["http://nginx.org/download/nginx-1.16.0.tar.gz","/usr/local/src/"]ADD ["nginx-1.16.0.tar.gz","/usr/local/src/"]img_work]# docker build -t tinyhttpd:v0.3 ./img_work]# docker run --name h3 --rm tinyhttpd:v0.3 ls /usr/local/src/
- WORKDIR:指定工作目录,逆序往上找到第一个就是工作路径
WORKDIR /usr/local/src/ADD http://nginx.org/download/nginx-1.16.0.tar.gz ./ADD ["nginx-1.16.0.tar.gz","./"]
- VOLUME:只能挂载Docker-managed volume
VOLUME /data/mysql/
- EXPOSE:用于为容器打开指定要监听的端口实现以外部通信,只能绑定暴露容器中的端口,动态绑定在宿主机的随机端口
EXPOSE[/ ][ [/ ]...] #protocol 协议
EXPOSE 80/tcp 22/tcp
- ENV:定义环境变量,可注入容器,可以被ADD,COPY等指令所调用
ENV= ...
ENV DOC_ROOT="/var/www/html/"COPY ["index.html","$DOC_ROOT"]
# docker run --name h5 -e HTTP_PORT=8888 --rm tinyhttpd:v0.5 printenv #启动容器时注入环境变量
- RUN:在docker build时执行命令
RUN cd /usr/local/src/ && \ tar -xf nginx-1.16.0.tar.gz
- CMD:在docker run时执行的默认命令,可以写多个,但只有最后一个生效
1.CMD#使用bash解析命令执行2.CMD [" "," "," "]3.CMD ["/bin/bash","-c"," "," "]4.CMD [" "," "] #CMD的参数传递给ENTRYPOINT
image_work2]# vim DockerfileFROM busyboxLABEL Author="Dongfei"ENV WEB_DOC_ROOT="/data/web/html"RUN mkdir -p ${WEB_DOC_ROOT} && \ echo 'Busybox httpd server.
' > ${WEB_DOC_ROOT}/index.htmlCMD /bin/httpd -f -h ${WEB_DOC_ROOT}image_work2]# docker build -t tinyhttpd:v0.7 ./image_work2]# docker image inspect tinyhttpd:v0.7 |grep "CMD" "CMD [\"/bin/sh\" \"-c\" \"/bin/httpd -f -h ${WEB_DOC_ROOT}\"]"# docker run --name tinyweb7 -it --rm -P tinyhttpd:v0.7# docker exec -it tinyweb7 /bin/sh
CMD ["/bin/httpd","-f","-h","/data/web/html"]image_work2]# docker image inspect tinyhttpd:v0.8 |grep "CMD" "CMD [\"/bin/httpd\" \"-f\" \"-h ${WEB_DOC_ROOT}\"]"
- ENTRYPOINT:类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序;与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序
1.ENTRYPOINT#使用bash解析命令执行2.ENTRYPOINT [" "," "," "]3.ENTRYPOINT ["/bin/bash","-c"," "," "]
# vim DockerfileFROM busyboxLABEL Author="Dongfei"ENV WEB_DOC_ROOT="/data/web/html"RUN mkdir -p ${WEB_DOC_ROOT} && \ echo 'Busybox httpd server.
' > ${WEB_DOC_ROOT}/index.htmlENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}# docker build -t tinyhttpd:v0.10 ./# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.10
img3]# vim entrypoint.sh#!/bin/shcat > /etc/nginx/conf.d/www.conf << EOFserver { server_name $HOSTNAME; listen ${IP:-0.0.0.0}:${PORT:-80}; root ${NGX_DOC_ROOT:-/usr/share/nginx/html/}; }EOFexec "$@" #执行所有传入的参数img3]# vim DockerfileFROM nginx:1.14-alpineLABEL maintainer="Dongfei"ENV NGX_DOC_ROOT="/data/web/html/"ADD index.html ${NGX_DOC_ROOT}ADD entrypoint.sh /bin/CMD ["/usr/sbin/nginx","-g","daemon off;"]ENTRYPOINT ["/bin/entrypoint.sh"]img3]# vim index.htmldongfei index
img3]# docker build -t myweb:v0.1 ./# docker run --name myweb1 --rm -P myweb:v0.1[root@docker ~]# docker exec -it b41252ebbaa8 sh/ # wget -O - -q b41252ebbaa8dongfei index
注意:json数组中,注意要使用双引号
- USER:指定用户
USER|
- HEALTHCHECK:容器健康监测
--interval=DURATION :每隔多次时间检测一次,默认30s--timeout=DURATION :每次检测超时时长,默认30s--start-period=DURATION :等待主进程启动的时间,默认0s--retries=N :检测几次失败任务为false,默认3次
0: success :命令返回值1:unhealthy2:reserved
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
EXPOSE 80/tcpHEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/
- SHELL:设置使用的shell,默认使用/bin/sh
- STOPSIGNAL signal :设置使用docker stop命令停止容器时向主进程发的信号
- ARG:定义Dockerfile变量,在docker build 传值
ARG author="Dongfei"LABEL maintainer="${author}"
- ONBUILD:用于在Dockerfile中定义一个触发器,当其他Dockerfile将自己的镜像当做基础镜像时执行;不能自我嵌套,不能执行MAINTAINER指令
ONBUILD ADD http://xxxx.bat