Dockerfile详解
Posted skyflask
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile详解相关的知识,希望对你有一定的参考价值。
一、Dockerfile 概念
1、Dockerfile是什么
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。
二、Dockerfile构建方式
- 通过使用build命令,根据Dockerfie的命令来构建镜像,默认加载当前目录下的Dockerfile文件
- 通过源代码路径的方式,即指定Dockerfile文件位置,比如Git仓库位置
- 通过标准输入流的方式
通过源代码路径方式
- Dockerfile需要放置在项目的根目录位置
- 在构建的时候,Dockerfile client会把整个context打包发送到Docker Server端,然后由server端负责build镜像,在构建成功后,会删除context目录
- docker build -t {镜像名字} {项目路径可以是相对路径}
通过标准输入流方式
- 通过标准输入流的方式获取Dockerfile的内容
- client不会打包上传context目录,因此对于一些ADD、COPY等涉及host本地文件复制的操作不能够支持
- docker build -t {镜像名字} - < Dockerfile路径
通过build命令
- 这是最常用的方式,docker build -t {镜像名字} {项目路径可以是相对路径,也可以是网络文件}
- docker build -t="xuequn/nginx:v1" [email protected]:loveliuli/custom_dockerfile
- 注意:custom_dockerfile目录下必须存在Dockerfile文件才行!
三、构建缓存
- Dockerfile中的每一个指令执行完毕后,都会提交为一个image,这样保证了指令之间不会有影响
- Dockerfile会尽可能尝试重用之前已经构建的镜像
- 可以通过在build命令中增加--no-cache的方式来禁用这个cache
四、Dockerfile常用指令
- 只支持Docker自己定义的一套指令,不支持自定义
- 大小写不敏感,但是建议全部使用大写
- 根据Dockerfile的内容顺序执行
RUN
都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN command1
的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxxEXPOSE 声明端口
格式为 EXPOSE <端口1> [<端口2>...]
。
EXPOSE
指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P
时,会自动随机映射 EXPOSE
的端口。
以上是关于Dockerfile详解的主要内容,如果未能解决你的问题,请参考以下文章