Dockerfile指令
Dockerfile 由一行行命令语句组成,注释以 #开头。Dockerfile 分为 4 部分:基础镜像,维护者信息,镜像操作指令,容器启动时执行的指令。每执行一个指令,都会创建一个镜像层并对镜像进行提交。导致构建的镜像臃肿。
指令
- FROM
FROM 是需要基于基础的镜像。FROM是必须的并且必须是第一条指令。推荐使用官方的镜像。
格式
| 1 | # 没有`tag`默认是`latest`。 | 
案例
| 1 | FROM ubuntu:18.04 | 
- RUN
RUN是用来执行命令行命令的。RUN指令有两种格式。由于每一次执行都会添加一个层,为了减少层,可以使用一个 RUN 执行多个命令。多个命令之间使用&&分割。为了可读性,可以将每一个命令换行,每一行后面加上换行符(\)即可。有时候构建需要一些额外的资源,这些资源并不会被删除,会一直跟着镜像。导致镜像很大。为减少镜像大小,可在最后删除掉这些无关的文件,只保留正在需要的东西。
格式
| 1 | RUN wget -O - https://some.site | wc -l > /number | 
案例
| 1 | RUN mkdir -p app && apt-get update && npm install | 
- CMD
CMD指令用于指定容器启动时需要运行的命令。
格式
| 1 | CMD ["可执行文件", "参数1", "参数2"] | 
案例
| 1 | CMD ['npm', 'app'] | 
注意:使用docker run命令可以覆盖 CMD 指令 ,假设Dockerfile 中的 CMD为CMD ["npm", 'app'], 当执行 docker run -it app /bin/bash的时候,并不会执行 npm app 而是执行 /bin/bash。
- EXPOSE
EXPOSE指令告诉 Docker 该容器内的应用程序将会使用容器的指定端口。可以使用多个EXPOSE指令向外部公开多个端口。
格式
| 1 | EXPOSE <port> | 
案例
| 1 | EXPOSE 3000 | 
- ENV
ENV指令用来在镜像构建过程中设置环境变量。这些环境变量也会被持久保存到创建的容器中。
可以通过docker run -e "NODE_ENV=test"传递环境变量。
格式
| 1 | ENV <key> <value> | 
案例
| 1 | ENV NODE_ENV test | 
- ADD
ADD指令与COPY格式和性质基本一致。ADD的源路径可以是一个URL。尽可能使用 copy。
只有当 COPY达不到要求的时候才使用。类如源路径是远程的链接地址。
- COPY
COPY指令将从构建上下文目录中的文件复制到新的一层镜像内的位置。
格式:
| 1 | COPY <原路径> <目标路径> | 
案例
| 1 | COPY package*.json /app/ | 
- ENTRYPOINT
ENTRYPOINT指令和COPY类似。区别在于ENTRYPOINT不会在容器启动时被覆盖。docker run命令行中指定的参数都会被当做参数传递给 ENTRYPOINT。
- VOLUME
VOLUME指令用来创建一个可以从本地或其他容器挂载的挂载点,用于数据持久化。
格式
| 1 | VOLUME [主机目录] | 
案例
| 1 | VOLUME ['/data', '/logs'] | 
- USER
USER指令指定镜像会以什么样的用户去运行。可以通过docker run -u nginx覆盖该指令。不指定将会以root用户运行。
格式
| 1 | USER <用户> | 
案例
| 1 | USER nginx | 
- WORKDIR
WORKDIR指令是在从该镜像创建容器时。在容器内部创建一个工作目录,ENTRYPOINT和CMD 指定的程序会在这个目录下执行。在docker run时候可以使用-w覆盖工作录。WORKDIR指令可以为 Dockerfile中其他指令设置工作目录。
格式
| 1 | WORKDIR <path> | 
案例
| 1 | WORKDIR /usr/src/api | 
- ONBUILD
ONBUILD指令式当以当前镜像为基础镜像,去构建下一级镜像的时候被执行。
格式
| 1 | ONBUILD <其他指令> | 
案例
| 1 | ONBUILD COPY ./package.json /app | 
- MANITAINERMANITAINER指令指定该镜像的作者信息。姓名和联系方式
格式
| 1 | MANITAINER <姓名> <联系方式> | 
案例
| 1 | MANITAINER James "james@example.com" | 
- LABEL
LABEL指令用于为该镜像添加一些元数据,元数据以键值对的形式展示。
格式
| 1 | LABEL <key=value> <key1=value1>... | 
案例
| 1 | LABEL location="New Youk" type="Data Center" | 
install_url to use ShareThis. Please set it in _config.yml.


