## **Dockerfile介绍(摘自网络)**
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
### **简单的教程**
```
#指定镜像,如果本地不存在那么会去hub pull下来
From node:10.11.0
#指定工作目录
WORKDIR /usr/local/myapp
#将软件包添加到指定目录
#需要注意的是使用ADD如果 src 是一个tar包,那么会自动解压,并且src支持网络路径。
#还有一个注意的点,app.tar.gz一定要和Dockerfile文件同目录
ADD app.tar.gz /usr/local/myapp
#开放的端口
EXPOSE 10086
#运行的命令,注意容器会自己记录日志,所以如果是java等去运行的时候别去守护进程和忽略日志
CMD node server
```
# 参数说明(摘自网络):
**FROM**
指定基础镜像,生成新镜像必须指定一个基础镜像,然后在此基础镜像上逐一运行随后的指令,最后生成新镜像,例如:
```
FROM ubuntu:16.04
```
**RUN**
在镜像内运行命令,注意,这是在镜像打包过程中运行的命令,不是启动容器后的命令。RUN指令常常用来在镜像打包过程中安装软件,例如:
```
RUN apt-get update \
&& apt-get install nginx
```
> 可以使用转移符 \ 书写多行指令
RUN其实调用的是标准的shell,所以可以通过 && 连接执行多个命令
**CMD**
指定容器启动时执行的命令,注意,和RUN的区别是:RUN是在打包过程中执行的命令。镜像中只能有一条CMD指令,如果有多个CMD指令,则以最后一条为准,所以我们可以覆盖基础镜像中定义的CMD指令。CMD指令支持三种格式:
```
CMD ["executable", "param1", "param2"] //使用exec执行
//CMD command param1 param2 使用/bin/sh -c执行
CMD ["param1", "param2"] //提供给ENTRYPOINT的默认参数
```
**ENTRYPOINT**
容器启动入口,即容器启动后执行的命令,不会被CMD指令覆盖,如果存在ENTRYPOINT,那么CMD指令会充当ENTRYPOINT的参数。
```
ENTRYPOINT /app/entrypoint.sh
```
**WORKDIR**
指定后续RUN、CMD、ENTRYPOINT程序的工作目录,可以多次执行,就像Linux的 cd 命令。
```
WORKDIR /app
WORKDIR data
RUN pwd # /app/data
```
**USER**
指定后续RUN、CMD、ENTRYPOINT程序的用户名或UID。
```
USER nginx
```
**ENV**
声明一个环境变量,可为后续的RUN、CMD、ENTRYPOINT程序所使用。
```
ENV JAVA_HOME /opt/java
```
**EXPOSE**
声明容器需要暴露的端口号。
```
EXPOSE 80 443
```
**VOLUME**
声明容器运行时的数据卷挂载点,将主机目录挂载到容器中,用来持久化保存容器生成的数据。
```
VOLUME /app/data
```
**ADD**
将Dockerfile所在目录中的文件拷贝到镜像中,ADD <src> <dest>,如果 src 是一个tar包,那么会自动解压,并且src支持网络路径。
```
ADD app.tar.gz /usr/local/myapp
```
**COPY**
和ADD类似,格式为 COPY <scr> <dest> ,复制本地文件到容器中,和ADD区别是,不会自动解压,推荐使用COPY。
```
COPY server.jar /app/server.jar
COPY . /app
COPY dist/* /app/
```