Dockerfile语法梳理和最佳实践

Dockerfile里面定义了许多关键字,如FROM、RUN等等,通过这些关键字来定义Dockerfile。

1. FROM

FROM通常是Dockerfile最开头的语法,这个语法指定了base image是什么,即想在哪个base image之上build。

  • 如果不需要任何的base image,只是要从头build的话,那么写FROM scratch;
  • 更多的情况是利用已有的base image,在这基础之上进行build,比如在centos或者ubuntu等image之上进行build
    在这里插入图片描述

2. LABEL

LABEL用于描述作者信息、版本号等信息,LABEL有点像代码里的注释,最好还是写上!
在这里插入图片描述

3. RUN

RUN是非常常用的,用于运行一些命令,比如安装一些软件的时候。每运行一次RUN,都会在image里添加新的一层。所以为了不增加那么多层,在每个命令之间使用&&进行连接,这样运行完所有的命令后,实际上只增加了一层,同时我们可以使用\进行换行,增加可读性。
在这里插入图片描述

4. WORKDIR

WOKRDIR用于设定工作目录,其作用类似于cd的作用,下图的WORKDIR /test,即cd 到/test目录下,没有就创建,下一个WOKRDIR demo即cd 到相对目录demo下,没有demo就创建,所以最后的RUN pwd就输出的/test/demo。

  • 如果需要用切换目录的情况,尽量使用绝对目录,不要使用相对目录;
  • 用WORKDIR,不要用RUN cd
    在这里插入图片描述

5. ADD and COPY

ADD和COPY都是把本地文件添加到Docker里面,比如下图中通过ADD或COPY把hello文件添加到Docker的根目录里面去。

  • ADD和COPY的区别是,ADD还有解压缩的功能
  • 大部分情况下,添加本地文件,COPY优先使用;如果添加远程文件,可以使用RUN curl或wget

在这里插入图片描述

6. ENV

ENV用于定义常量,可以在其他命令中使用
在这里插入图片描述

7. RUN vs CMD vs ENTRYPOINT

7.1 RUN

  • RUN:执行命令并创建新的Image Layer;

7.2 CMD

  • 设置容器启动后默认执行的命令和参数;
  • 如果docker run指定了其他命令,CMD命令被忽略;
  • 如果定义了多个CMD,只有最后一个会执行;

7.3 ENTRYPOINT

  • ENTRYPOINT:设置容器启动时运行的命令,让容器以应用程序或服务的形式运行;
  • 不会被忽略,一定会执行;

8. EXPOSE

暴露出外界可以访问的端口

猜你喜欢

转载自blog.csdn.net/qq_36986015/article/details/108233431