Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
常用指令:FROM、CMD、RUN、EXPOSE、ENV、WORKDIR等
指定基础镜像,必须为第一个指令,可使用多个FROM,尽量使用官方提供的image
执行命令,常用于安装所需文件,复杂的RUN建议使用 \
和&&
合并成一行,减少无意义分层
FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz # 以上执行会创建 3 层镜像。可简化为以下格式: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
指定工作目录
WORKDIR /workspace/
注意:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
将复制上下文目录文件复制到容器指定路径,ADD可将压缩文件自动解压至目标目录,大部分情况COPY优于ADD
定义镜像的元数据,类似于注释
声明端口,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
设置环境变量,可在后续指令中使用
ENV MYSQL_VERSION 5.6 # 设置环境变量 RUN apt-get install -y mysql-server = "${MYSQL_VERSION}" \ $$ rm -rf /var/lib/apt/lists/* # 引用
指定容器挂载目录,docker run
的时候,可以通过 -v 参数修改挂载点
类似于
CMD
指令,但其不会被docker run
的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT
指令指定的程序。
但是, 如果运行docker run
时使用了--entrypoint
选项,将覆盖CMD
指令指定的程序。
注意:如果Dockerfile
中如果存在多个ENTRYPOINT
指令,仅最后一个生效。
类似于RUN
指令,用于运行程序,但CMD
在docker run
时运行,RUN
是在 docker build
。
注意:CMD
指令指定的程序可被 docker run
命令行参数中指定要运行的程序所覆盖;如果 Dockerfile
中如果存在多个CMD
指令,仅最后一个生效。
添加维护者信息
MAINTAINER John