dockerFile

保留字指令

- FROM 基础镜像
- MAINTAINER 镜像维护者的名字和邮箱
- RUN 容器构建时需要运行的命令
- EXPOSE 当前容器对外暴露的端口号
- WORKDIR 终端默认进入该容器的工作目录
- ENV 为容器设置环境变量(网络代理)
- ENV MY_PATH /usr/mytest
- WORKDIR MY_PATH
- ADD 拷贝加解压缩,将宿主机目录下的文件拷贝进镜像且add命令会自动处理URL和解压tar压缩包
- ADD xxx.tar.gz /
- COPY 拷贝 
- COPY xxxx /
- COPY [‘src’, ‘dest’]
- VOLUME 容器卷用于数据持久化
- VOLUME [‘xxxxlujing’, ‘xxxxxxx’, ‘xxxx’]
- CMD  用于指定一个容器启动时要运行的命令(dockerfile中可以有多个CMD但只有最后一个生效,且会被docker run 后面的参数替换)
- ENTRYPOINT  指定一个容器启动时要运行的命令,目的和CMD一样,但不会被替换,docker run后会追加
- ONBUILD  当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发(相当于回调,只要子镜像继承了我,我就触发一个onbuild做一些(收尾)工作)

流程分析

  • FROM 从基础镜像运行一个容器
  • 执行一条指令并对容器做出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker再基于刚提交的新镜像运行一个新容器
  • 执行dockerfile中的下一条指令

规则

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

实践

  • 通过docker build把dockerfile变为image
  • docker build -f filename -t name:version .
    1
    2
    3
    4
    5
    6
    7
    FROM centos
    ENV MY_PATH /tmp
    WORKDIR $MY_PATH
    RUN yum -y install vim
    RUN yum -y install net-tools
    EXPOSE 80
    CMD /bin/bash

CMD和ENTRYPOINT的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
entryponit
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "https://ip.cn"]

# CMD
FROM centos
RUN yum install -y curl
CMD ["curl", "-s", "https://ip.cn"]

在CMD生成的镜像使用docker run ip -i
会报错,因为-i覆盖了curl -s https://ip.cn
而ENTRYPOINT加-i会生成:
curl -s https://ip.cn -i

ADD和COPY的区别

1
2
3
4
5
6
7
FROM centos
MAINTAINER chunjianghuayueye
COPY c.txt /usr/local/cccc.txt
ADD mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz /usr/local
RUN yum install -y vim
ENV MYPATH /usr/local
WORKDIR $MYPATH

ONBUILD

1
2
3
4
5
6
7
8
父镜像的dockerfile中写
ONBUILD RUN echo “father onbuild ----886”
创建父镜像

子镜像
FROM FATHER
当执行docker build子镜像
触发父镜像的ONBUILD命令
分享到