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"]
```

 

posted @ 2020-08-13 20:44  小琪子  阅读(248)  评论(0)    收藏  举报