还是话不多说,直接开始
我们先说说 Dockerfile的语法
1.每个Dockerfile必须以FROM指令开头,FROM指明了当前镜像创建的基镜像,也就是说每个镜像必须基于一个已存在的镜像进行创建。FROM指令后直接跟基镜像的名称或者镜像名称加标签。镜像的名称和标签可以去Docker Hub或者使用命令docker search keyword 进行搜索。1
2
3
4>案例:
> 1.FROM scratch 表示不指定具体镜像使用空镜像作为基础镜像。
> 2.FROM centos #使用centos做为基础镜像
> 3.FROM ubuntu:14.00 #指定具体版本
ps: 为了安全 应尽量使用官方 image 作为基础镜像
2.LABEL 关键字 标签? 看案例1
2
3> 1.LABEL maintainer=“purui@qq.com”
> 2.LABEL version="1.0.0"
> 3.LABEL description="描述"
3.RUN 关键字 运行命令 RUN命令有两种格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25> 1.RUN yum update && yum install -y vim
> 2.RUN ["/bin/bash","-c","echo hello"]
```
<u>ps:注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.
多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
RUN书写时的换行符是\</u>
* * *
4.WORKDIR 关键字 可以设定当前的工作目录
> 1.WORKDIR /root #如果没有 root目录会自动创建
<u>ps:不推荐使用 RUN cd 推荐使用绝对目录</u>
* * *
5.ADD关键字 可以从宿主机copy 文件到image中,如果是压缩文件还会自动解压
> 1.ADD hello.sh / #copy hello.sh 到 根目录下
> 2.如果先使用 WORKDIR /root 指定目录,再运行 ADD hello.sh /test #会copy到 /root/test/下面
6.ENV 关键字 声明常量
语法有两种
- ENV
- ENV
= …
3.ENV MYSQL_VERSION 5.6
RUN apt-get install mysql-server=”${MYSQL_VERSION}”
1
2
3 7.CMD 命令为运行容器执行默认的命令,如果有多个命令那么它只执行最后一个
语法有三种写法
- CMD [“executable”,”param1”,”param2”]
- CMD [“param1”,”param2”]
- CMD command param1 param2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 8.RUN & CMD
>不要把RUN和CMD搞混了。
>
>RUN是构件容器时就运行的命令以及提交运行结果
>
>CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子
9.EXPOSE 可以暴露容器内部的应用端口 给宿主机访问
10.ENTRYPOINT 功能是启动时的默认命令
>与CMD比较说明(这俩命令太像了,而且还可以配合使用):
>
>1. 相同点:
>
>只能写一条,如果写了多条,那么只有最后一条生效
>
>容器启动时才运行,运行时机相同
>
>
>
>2. 不同点:
>
> ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
>
> 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
> 如下:
FROM ubuntu
ENTRYPOINT [“top”, “-b”]
CMD [“-c”]1
2
3如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效
如下:
FROM ubuntu
ENTRYPOINT [“top”, “-b”]
CMD ls -al`
那么将执行ls -al ,top -b不会执行。
这是docker 官方给出的 组合执行情况/9C7EDE9A-0F54-449B-BE72-73D73984AA5D.jpg)
评论加载中