DockerFile构建

Dockerfile是一个文本文件,定义如何构建docker镜像,记录镜像构建的所有步骤
DockerFile分为四部分组成:基础镜像信、维护者信息、镜像操作指令和容器启动时执行指

Dockerfile语法

image.png
shell与exec形式的区别

shell形式-ENTRYPOINT node app.js
exec形式-ENTRYPOINT ["node","app.js"]
两者区别在于指定命令是否在shell中被调用
可在容器中运行进程列表看出:
docker exec docker-id ps x
发现 shell形式中 主进程PID 1 是shell进程而非node进程。shell进程往往是多余的。因此最好采用exec形式ENTRYPOINT指令。
因为指令可读性更强,更容易理解

FROM
FROM 先找本地镜像,没有再去下载它
格式:from image 或 from image:tag
MAINTAINER

MAINTAINER 名称联系方式

ENV

为镜像定义所需的环境变量,并可被Dockerfile 文件中位于其后的其他指令(ENV,ADD,COPY)调用
调用格式为{}

格式

1.ENV key value
2.ENV key=value

第一格式中:key之后所有内容均会被视作value部分。所以一次只能设置一个变量
ENV path /usr/local/mysql/bin:$PATH
 
第二格式中:可用一次设置多个变量,每个变量为一个key=value
若value中包含空格,可以以反斜线\进行转义,也可通过value加引号进行标识。反斜线也可续行
vim Dockerfile
FROM busybox:latest
MAINTAINER "wzs"
ENV DOC_ROOT  /data/web/html  \
   WEB_PACKAGE="nginx-1.15.tar.gz"

COPY index.html  $DOC_ROOT
#COPY index.html  {$DOC_ROOT:-/data/web/html} #不用ENV DOC_ROOT  /data/web/html也生效
COPY  yum.repos.d /etc/yum.repos.d/
WORKDIR /usr/local/
ADD ${WEB_PACKAGE} ./src/
WORKDIR
格式:WORKDIR/path/to/workdir
解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。
可以多次切换(相当于cd命令)

也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。
RUN

RUN:构建镜像时安装应用和软件包

注意:每个run命令会生成一个镜像层[多个镜像层即image空间会大
所以尽量使用&& 将命令用一个RUN运行]
RUN  yum update&&yum install -y vim 

ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

COPY

将文件从本地复制放到镜像
COPY两种格式:
COPY src dest 与 COPY [“src”,”dest”]
src 要复制的源文件/目录【该路径要与Dockerfile同个目录下,或Dockerfile同个目录下的子目录,否则不行】,
支持使用通配符
dest 目标路径【绝对路径或以WORKDIR为其起始路径】\

src 只能指定build context 中的文件或目录
src是目录,其内部文件或子目录会被递归复制,但目录自身不会被复制,所以dest需要自身命名该目录名字
host中目录yum.repo.d中内容,复制到/etc/yum.repos.d/目录下,不会将host中目录yum.repo.d整个拷贝进去
COPY yum.repo.d /etc/yum.repos.d/

指定多个src或src使用通配符,则dest必须是一个目录,且必须以/结尾。否则会以该名字命名
COPY index.html /data/web/html
则容器生成/data/web/html文件,而不是/data/web/html/index.html
若dest 不存在该目录则会自动创建\

vim Dockerfile
FROM busybox:latest
MAINTINER "wzs"
COPY index.html /data/web/html/

docker build -t web:1.0 .
docker run --name web1 --rm  web:1.0
cat /data/web/html/index.html
ADD

与copy一样.不同是,若src是归档文件(tar,zip,tgz,xz),文件会被自动解压到dest
若src为URL且dest不以/结尾,则dest指定文件将被下载并直接创建为dest
以/结尾,则文件URL自动文件件直接下载保存为/path /filename\

src为本地系统tar,则将被(自动解压)展开为一个目录。\

若通过url获取tar文件(不会自动解压)展开

指定多个src或src使用通配符,则dest必须是一个目录,且必须以/结尾,
若dest不以/结尾,则视为一个普通文件,src内容将直接写入到dest

FROM busybox:latest
MAINTAINER wzs
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d
#ADD http://nginx.org/download/nginx-1.15.tar.gz  /usr/local/src/
ADD nginx-1.14.0.tar.gz /usr/local/src/

docker build -t wweb1.6 .
docker run -it --name web1.6 wweb1.6 ls /usr/local/src/
nginx-1.14.0
ENTRYPOINT与CMD

Dockerfile中两种指令分别定义命令与参数两部分
ENTRYPOINT 定义容器启动时被调用的可执行程序
CMD 指定传递给ENTRYPOINT参数
cmd也可指定镜像运行时执行命令,但正确做法还是entrypoint做指令,cmd指定默认参数,
这样可直接运行镜像无须添加参数

test.sh
time=$1
while :
do
echo "wzs"
sleep $time
done

Dockfile
ENTRYPOINT ["/bin/test.sh"]
CMD ["1O"] 
#容器启动时test.sh脚本10秒后才执行

启动文件方式

CMD ["/opt/start.sh"]
CMD ["sh", "-c", "/opt/start.sh"]
CMD sh +x /opt/start.sh
EXPOSE

为容器打开指定要监听端口以实现与外部通信默认为tcp
EXPOSE 11211/tcp 11211/udp

VOLUME
格式:VOLUME ["/data"]
#在本地物理机随机命名给目录挂载到容器/data目录中
可以将本地文件夹或者其他container的文件夹挂载到container中
出于对可移植性和安全性的考虑,你不能在 Dockerfile 中指定数据卷将会使用的主机目录

如果挂载点目录路径下此前文件存在,docker run会在卷挂载完成后将此前的所有文件复制到新挂载的卷中

你可能感兴趣的:(DockerFile构建)