3.6dockerfile语法梳理及最佳实践

在本节中,我们对常用的Dockerfile语法进行梳理。

FROM

FROM scratch # 制作base image
FROM centos     # 使用base image

注意:尽量使用官方的image作为base image

LABEL

LABEL maintainer="moluo@163.com"        # 镜像作者
LABEL version="1.0"                        # 镜像版本
LABEL description="this is description"    # 镜像描述

建议:Metadata不可少

ENV

ENV MYSQL_VERSION 5.6
RUN apt-get install -y mysql-server="&{MYSQL_VERSION}" \
    && rm -rf/var/lib/apt/lists/*    # 引用常量

建议:尽量使用ENV增加可维护性

WORKDIR

强制:用WORKDIR ,不要使用RUN cd

建议:为了清晰,尽量使用绝对目录

ADD and COPY

注意:大部分情况,copy优于ADD

注意:ADD除了COPY还有额外功能(解压)

提示:添加远程文件/目录请使用crul或者wget

RUN

执行命令并创建新的Image Layer

建议一:为了美观,复杂的RUN请使用反斜线换行

建议二:每运行一次RUN,image都会新建一层,为了避免无用分层,合并多条命令成一行

CMD

CMD:设置容器启动后默认执行的命令和参数

注意一:如果docker run指定了其他命令,CMD命令被忽略。

注意二:如果定义了多个CMD,只有最后一个会执行

ENTRYPOINT

ENTRYPOINT:设置容器启动时运行的命令

让容器以应用程序或者服务的形式运行

不会被忽略,一定会执行

VOLUME and EXPOSE

储存和网络

后期补充

Shell格式和Exec格式

Shell格式

Exec格式

Shell格式示例

Exec格式正确示例

Exec格式错误示例一

错误原因:$name不会被视为一个变量。若想要将其识别为变量,可采用["/bin/bash","-c","..."]

Exec格式错误示例二

错误原因:使用”/bin/bash“时,”echo hello $name“应该视为一个参数,而不是两个

补充

官方Image Dockerfile:Docker-library

参考

Dockerfile reference

Last updated

Was this helpful?