Docker Flie

七、Docker File

  • .dockeringore:打包忽略的文件列表,每行写一个文件的路径,可使用通配符
  • FROM指令:指定基础镜像
FROM <repository>[:<tag>]  or FROM <repository>@<digest>
~]# mkdir img_work  #创建工作目录
~]# cd img_work/
img_work]# vim Dockerfile  #注意D大写
# Description: my image  #描述信息
FROM centos:centos7.5.1804  #基础镜像
LABEL maintainer="Dongfei <Dongfei@localhost.com>"  #元数据
  • COPY指令:
COPY ["<src>",..."<dest>"]
	1.<src>必须是build上下午中的路径,不能是父目录中的文件
	2.如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录本身不会被复制
	3.如果指定多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
	4.如果<dest>事先不存在,它将会被自动创建,这包括其父目录
# 复制网页文件
img_work]# vim Dockerfile
COPY ["index.html","/var/www/html/"]
img_work]# vim index.html
<h1>My Docker website.</h1>
img_work]# docker build -t tinyhttpd:v0.1 ./
img_work]# docker run --name h1 --rm tinyhttpd:v0.1 cat /var/www/html/index.html
<h1>My Docker website.</h1>
# 复制yum源
img_work]# cp -r /etc/yum.repos.d/ ./
img_work]# vim Dockerfile
COPY ["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 ["<src>",..."<dest>"]
	1.<src>如果是本地的tar文件,则会自动展开至镜像中
	2.<src>如果是URL的tar文件,则不会自动展开
img_work]# wget http://nginx.org/download/nginx-1.16.0.tar.gz
img_work]# vim Dockerfile
ADD ["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 <port>[/<protocol>][<port>[/<protocol>]...] #protocol 协议
EXPOSE 80/tcp 22/tcp
  • ENV:定义环境变量,可注入容器,可以被ADD,COPY等指令所调用
ENV <key>=<value> ...
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 <command>  #使用bash解析命令执行
2.CMD ["<executable>","<param1>","<param2>"]
3.CMD ["/bin/bash","-c","<executable>","<param1>"]
4.CMD ["<param1>","<param2>"]  #CMD的参数传递给ENTRYPOINT
image_work2]# vim Dockerfile
FROM busybox
LABEL Author="Dongfei"
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT} && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
CMD /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 <command>  #使用bash解析命令执行
2.ENTRYPOINT ["<executable>","<param1>","<param2>"]
3.ENTRYPOINT ["/bin/bash","-c","<executable>","<param1>"]
# vim Dockerfile
FROM busybox
LABEL Author="Dongfei"
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT} && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
ENTRYPOINT /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/sh
cat > /etc/nginx/conf.d/www.conf << EOF
server  {
        server_name $HOSTNAME;
        listen ${IP:-0.0.0.0}:${PORT:-80};
        root ${NGX_DOC_ROOT:-/usr/share/nginx/html/};
        }
EOF
exec "$@"  #执行所有传入的参数

img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL 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.html
<h1>dongfei index</h1>

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 b41252ebbaa8
<h1>dongfei index</h1>

注意:json数组中,注意要使用双引号

  • USER:指定用户
USER <UID>|<UserName>
  • HEALTHCHECK:容器健康监测
--interval=DURATION  :每隔多次时间检测一次,默认30s
--timeout=DURATION :每次检测超时时长,默认30s
--start-period=DURATION :等待主进程启动的时间,默认0s
--retries=N :检测几次失败任务为false,默认3次
0: success  :命令返回值
1:unhealthy
2:reserved
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
EXPOSE 80/tcp
HEALTHCHECK --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
posted @ 2019-06-15 20:23  生生不息.连绵不绝  阅读(307)  评论(0编辑  收藏  举报