赞
踩
一、Dockerfile
Docekrile是用于docker构建镜像的文本文件,内容包括一条条构建docker镜像所需要的指令和说明。通过Dockerfile,docker镜像构建起来更加方便和快捷。
二、Dockerfile文件指令
FROM:FROM指令必须是Dockerfile中非注释行的第一个指令,为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境
语法:
FROM [:]
或
FROM @
:指定作为基础镜像的名称
:base image的标签,省略时候默认latest
:镜像的哈希码
示例:
FROM ubuntu:latest
MAINTAINER:用于让dockerfile制作者提供本人的详细信息
语法:
MAINTAINER <authtor’s detail>
示例:
FROM ubuntu:latest
MAINTAINER “XD”
COPY:用于从docker 主机复制新文件或者目录至创建的新镜像指定路径中
语法:
COPY <src>... <dest>
:要复制的源文件或目录
:目标路径,即正在创建的镜像的文件系统路径
ADD:指令类似于COPY指令,ADD支持使用TAR文件和URL路径
语法:
ADD …
示例:
1、拷贝单个文件
ADD ./a.txt WORKDIR/b
2、拷贝多个文件
ADD指令支持通配符,常用的示例如下:
#拷贝当前目录下的bin文件夹的所有sh文件到/usr/bin目录下
ADD ./bin/*.sh /usr/bin/
#拷贝当前目录下的bin文件夹的所有带后缀的文件到/usr/bin目录下
ADD ./bin/. /usr/bin/
#拷贝当前目录下的bin文件夹的所有不带后缀的文件到/usr/bin目录下
ADD ./bin/* /usr/bin/
#拷贝当前目录下的bin文件夹的所有文件到/usr/bin目录下(/usr/bin目录原有的文件会保留)
ADD ./bin/ /usr/bin/
3、拷贝文件夹
ADD ./config /usr/bin/config
WORKDIR:用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
语法:WORKDIR
VOLUME:用于在image中创建一个挂载点目录
语法:VOLUME
EXPOSE:用于为容器打开指定要监听的端口以实现与外部通信
语法:EXPOSE [/ ] [[/ ]
用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
EXPOSE指令可一次指定多个端口,例如:EXPOSE 11211/udp 11211/tcp
ENV:用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所调用,调用格式为$variable_ name 或 ${variable_ name}
语法:
ENV <key> <value> 一次只能设置一个
或
ENV = 一次可以设置多个键值对
RUN:用于指定docker build过程中运行的程序,其可以是任何命令
语法:
RUN <command>
或
RUN [“”, “”, “”]
第一种格式中,通常是一个shell命令, 且以“/bin/sh -c”来运行它,这意味着此进程在容器中的PID不为1,
不能接收Unix信号,因此,当使用docker stop 命令停止容器时,此进程接收不到SIGTERM信号;
第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令,后面的 为传递给命令
的选项或参数;
然而,此种格式指定的命令不会以“/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会进行;
不过, 如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式。
RUN [“/bin/bash”, “-c”, “”, “”]
注:Dockerfile构建文件时,每一个指令执行一次都会在docker上新建一层,层数过多会导致镜像膨胀过大,所以同一指令顺序多次执行时,采用" \ && "的方式。例如:
RUN export DEBIAN_FRONTEND=noninteractive
&& apt-get -yq update
&& apt-get -yq upgrade
CMD:类似于RUN指令,CMD指令也可用于运行任何命令或应用程序;
RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时。
CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖。
Dockerfile中可以存在多个CMD指令,但仅最后一个会生效
语法:
CMD <command>
或
CMD [“”,“”,“”]
或
CMD [“”,“”]
前两种语法格式的意义同RUN
第三种则用于为ENTRYPOINT指令提供默认参数
json数组中,要使用双引号,单引号会出错
USER:用于指定运行image时的或运行Dockerfile中任何RUN、CMD或EntRyPoInT指令指定的程序时的用户名或UID
默认情况下,container的运行身份为root用户
语法:
USER |
需要注意的是,可以为任意数字,但实践中其必须为/etc/ passwd中某用户的有效UID,否则,docker run命令将运行失败
ARG:ARG指令类似ENV,定义了一个变量。
区别于ENV:用户可以在构建时docker build --build-arg = 进行对变量的修改;ENV不可以。
如果用户指定了未在Dockerfile中定义的构建参数,那么构建输出警告。
语法:
ARG [= ]
Dockerfile可以包含一个或多个ARG指令
SHELL:SHELL指令允许覆盖用于shell命令形式的默认shell。
Linux上的默认shell是[“/ bin / sh”,“c”],在Windows上是[“cmd”,“/ S”,“/ C”]
SHELL指令必须以JSON格式写入Dockerfile。
SHELL [“executable”, “parameters”]
SHELL指令可以多次出现。
每个SHELL指令都会覆盖所有先前的SHELL指令,并影响所有后续指令。
三、通过Dockerfile构建镜像
docker中通过Dockerfile构建镜像的指令为:
docker build -t ImageName:TagName dir
-t:给镜像加一个Tag
ImageName:给镜像起的名称
TagName:给镜像的Tag名
Dir:Dockerfile所在目录
其中,如果Dockerfile在当前文件夹下,可用 " . "表示
例如:
docker build -t myubuntu:v1 .
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。