dockerfile 指令
# DockerFile构建镜像指令
### 一、FROM
指定基础镜像,后面跟存在的基础镜像,在dockerfile文件首行指定
```dockerfile
#使用java镜像当成基础构建镜像
FROM 10.13.16.10:5000/base/java:1.0
```
### 二、MAINTAINER
构建本镜像作者信息,后面跟作者名字以及作者邮箱地址
```dockerfile
#作者为dingbq,邮箱地址为moscowrabbit@gmail.com
MAINTAINER dingbq moscowrabbit@gmail.com
```
### 三、RUN
在镜像中执行命令,推荐在Dockerfile中执行越少RUN指令越好,可以一个RUN指令执行多个命令,中间用 ‘&&’ 分隔。如果跨行则需要在末尾指定 ‘\’。
```dockerfile
#RUN执行多个命令
RUN cd /usr/local/ \
&& tar -zxvf apache-tomcat-10.0.0-M7.tar.gz \
&& cd apache-tomcat-10.0.0-M7 \
&& cd bin \
```
### 四、COPY/ADD
从宿主机器拷贝文件到镜像当中,格式为COPY 源路径 目标路径。
```dockerfile
#将当前目录下的apache-tomcat-10.0.0-M7.tar.gz 拷贝到容器的/usr/local/目录下
COPY apache-tomcat-10.0.0-M7.tar.gz /usr/local/
ADD apache-tomcat-10.0.0-M7.tar.gz /usr/local/
```
### 五、EXPOSE
暴漏容器中的端口,如果容器中使用了某些端口,且想要把端口映射到宿主机中,则需要使用该指令暴漏端口,并在docker run中指定docker run -p 8080:8080
```dockerfile
#暴漏8080端口
EXPOSE 8080
```
### 六、WORKDIR
设置工作路径,WORKDIR指令是为RUN、CMD、ENTRYPOINT指令配置工作目录,其效果类似于Linux中的cd命令,用于目录的切换,但是和cd不一样的是WORKDIR如果不存在目录则会创建目录。
```dockerfile
#切换工作路径到/usr/local中
WORKDIR /usr/local/
```
### 七、ONBUILD
该命令是作用为,如果当前所创建的镜像用于构建其他镜像的基础镜像的时候,会优先执行ONBUILD指令。
```dockerfile
##子镜像在构建的时候触发
ONBUILD RUN echo "father image onbuild......"
```
### 八、USER
USER指令用于指定执行以下命令的用户,和WORKDIR一样,WORKDIR指定工作路径,USER指定执行以下指令的用户。
```dockerfile
#切换到kylin用户
USER kylin
```
### 九、VOLUME
容器运行时尽量不使容器的存储层发生写操作,对于数据库类需要动态保存数据的应用,其数据库文件应保存在卷(VOLUME)中,为了防止用户忘记将存储动态文件的目录挂载为卷,在Dockerfile中,我们可以事先指定某些目录挂载为匿名卷,这样即使在运行的时候用户不指定挂载,其应用也可以正常运行,不会像容器存储层写入大量的数据。
```dockerfile
#将/data目录挂载匿名卷
VOLUME /data
```
### 十、CMD
容器运行的时候执行该指令(docker run....),在Dockerfile中只能出现一次,如果出现多个,则只有最后一个有效,如果在docker run 中指定了该命令项,则会覆盖Dockerfile中的CMD。
```dockerfile
## CMD <命令>
## CMD ["可执行文件","参数一","参数二"]
CMD /usr/local/apache-tomcat-10.0.0-M7/bin/catalina.sh run
CMD ["/usr/local/apache-tomcat-10.0.0-M7/bin/catalina.sh","run"]
```
### 十一、ENTRYPOINT
ENTRYPOINT和CMD的用法和作用一样,但是ENTRYOINT和CMD有两点不一样:
- CMD会被docker run中的命令覆盖,但是ENTRYPOINT则不会
- CMD和ENTRYPOINT都存在是,CMD指令变成ENTRYPOINT的参数,并且此CMD提供的参数会被docker run中的命令覆盖
```dockerfile
#容器运行的时候启动tomcat
ENTRYPOINT ["/usr/local/apache-tomcat-10.0.0-M7/bin/catalina.sh","run"]
```
### 十二、ENV
ENV用来 设置容器的环境变量,这些变量以"key=value"的形式存在,在容器内可以被脚本或者程序调用,容器运行的时候此变量也会保留。
- 设置一个环境变量 ENV KEY VALUE
- 设置多个环境变量 ENV KEY=VALUE KEY2=VALUE2
```dockerfile
ENV JAVA_HOMG /opt/jdk
ENV PATH $PATH:$JAVA_HOMR/bin
```
### 十三、构建实例
下面是一个构建tomcat容器的实例,并且在容器启动的时候自动启动Tomcat
```dockerfile
FROM 10.13.16.10:5000/base/java:1.0
MAINTAINER dingboqi moscowrabbit@gmal.com
##拷贝tomcat到镜像当中
COPY apache-tomcat-10.0.0-M7.tar.gz /usr/local/
#执行命令
RUN cd /usr/local/ \
&& tar -zxvf apache-tomcat-10.0.0-M7.tar.gz \
&& cd apache-tomcat-10.0.0-M7 \
&& cd bin \
EXPOSE 8080
#CMD /usr/local/apache-tomcat-10.0.0-M7/bin/startup.sh
ENTRYPOINT ["/usr/local/apache-tomcat-10.0.0-M7/bin/catalina.sh","run"]
```

浙公网安备 33010602011771号