Dockerfile详解

Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。

  1. 基础镜像信息:FROM ubutu

格式为FROM或FROM: ,Dockerfile第一条必须为FROM指令,如果一个Dockerfile要指定多个镜像,则每个镜像使用一个FROM指令

2.维护者信息:MAINTAINER xiaolu xiaolu@qq.com

格式为MAINTAINER,指定维护者信息,可省略

3.镜像操作指令:RUN apt-get update && apt-get install -y vim

格式为RUN或RUN ["executable", "Param1", "Param2"]

格式RUN:在shell终端运行,即/bin/sh -C

格式RUN [“executable”, “Param1”, “Param2”]:使用exec执行

每条run指令在当前基础镜像执行,并且重新提交新镜像,当命令比较长时可用"/"换行

4.容器启动时执行指令:CMD /usr/sbin/nginx

每个容器只能执行一条CMD命令,多个CMD命令时,只会执行最后一条。

支持三种格式:

1
2
3
4
5
CMD ["executable", "Param1", "Param2"]:使用exec执行,推荐

CMD command param1 param2:使用/bin/sh上执行

CMD ["Param1", "Param2"]:提供给ENTRYPOINT做默认参数

5.暴露端口指令:EXPOSE,例如:EXPOSE 80 22 8080

格式为:EXPOSE port1 port2 port3

告诉Docker服务端容器暴露的端口号,供互联系统使用。

在启动Docker时,主机会自动分配一个端口号转发到指定的端口,可用通过-P/-p,指定主机具体端口号进行映射。

6.设置环境变量ENV

格式为ENV,指定一个环境变量,会被后续的RUN指令使用,并且会在容器运行过程中保持。

1
2
3
4
5
6
7
ENV YC_NAME yc_framework

ENV YC_VERSION 1.0

RUN wget -C http://www.kevinlu.cc/$YC_NAME/$YC_VERSION | mvn install /usr/src/$YC_NAME-$YC_VERSION

ENV PATH /usr/src/$YC_NAME-$YC_VERSION/bin:$PATH

7.复制指定的文件到容器中ADD

ADD hom* /usr/file

若/usr/file目录不存在,则自动创建

源目录可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;也可以是一个tar文件(自动解压为目录)

8.复制本地主机的文件到容器COPY

格式:COPY file directory

拷贝的文件为Dockerfile所在目录的相对路径

9.容器启动后执行指令:ENTRYPOINT

格式:ENTRYPOINT ["executable", "Param1", "Param2"]

ENTRYPOINT command param1 param2

配置容器启动后需要执行的指令,并且不会被docker run提供的参数覆盖

每个Dockerfile中只能有一个ENTRYPOINT,如果有多个,则只会执行最后一个

10.指定工作目录WORKDIR

格式:WORKDIR /a/b/c

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录

可以使用多个WORKDIR指令,后续的命令的参数为相对路径时,会基于之前命令指定的目录

例如:

1
2
3
4
5
6
7
8
9
WORKDIR /a

WORKDIR b

WORKDIR c

WORKDIR d

RUN pwd<打印出/a/b/c/d>