(干货)构建镜像之Dockerfile
Dockerfile是一个文本文件,记录了镜像构建的所有步骤。
饭提示:学习Dockerfile构建镜像,就是在学习Dockerfile文件构建的命令+shell脚本语句
Dockerfile简单介绍
Docker可以使用Dockerfile的内容来自动构建镜像。Dockerfile是一个文件,其中有创建镜像、运行指令等一系列的命令,且每行只支持一个运行命令。
Docker file分为四部分组成:
基础镜像信
维护者信息
镜像操作指令
容器启动时执行指令
dockerfile指令忽略大小写,建议大写,#作为注释,每行只支持一条指令,指令可以带多个参数。
dockerfile指令有:
构建指令:用于构建image,其指定的操作不会在运行image的容器中执行。
设置指令:用于设置image的属性,其指定的操作会在运行image的容器中执行。
Dockerfile指令
Dockerfile指令一共有以下种:
1、FROM
用来指定基础镜像,然后通过在基础镜像上构建新的镜像,基础镜像一般有远程或本地仓库。并且Dockerfile文件第一行必须的FROM指令,如果一个Dockerfile需要创建多个镜像,可以使用多个FROM指令。
#具体使用用法如下:
FROM < image_name > #默认是latest版本
FROM <image:version> #指定版本
| 
 eg:  | 
 FROM mysql:5.6  | 
2、MAINTAINER
指定镜像的创建者信息
#具体使用法如下:
MAINTAINER < name >
| 
 eg:  | 
 MAINTAINER fanfan  | 
3、RUN
运行所有基础镜像能支持的命令,同样也可以使用多条RUN指令,可以使用\来换行
#具体使用法如下:
备注:# 由shell启动,Linux默认为`/bin/sh -c`,Windows默认为`cmd /S /C`
RUN < command > #shell启动
RUN ["executable", "param1", "param2" ... ] (exec form)
| 
 eg:  | 
 RUN yum -y update  | 
| 
 RUN ["/etc/execfile", "arg1", "arg1"]  | 
4、CMD
用于容器启动时的指定操作,它可以是命令,也可以是脚本,但只执行一次,如果有多个,默认只会执行最后一个。
#具体使用法如下:
CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐
CMD command param1 param2,在/bin/sh上执行
CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。
| 
 eg:  | 
 CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"]  | 
5、EXPOSE
指定容器的端口映射(容器与物理机),运行容器时加上-p参数指定EXPOSE设置的端口。EXPOSE可以设置多个端口号,相应地运行容器配套多次使用-p参数。可以通过docker port +容器需要映射的端口号和容器ID来参考宿主机的映射端口。
#具体使用法如下:
EXPOSE <port> [port1 , port2 ............]
| 
 eg:  | 
 EXPOSE 80 443 EXPOSE 8080 例如-p 3307:3306将容器内的3306绑定到本机的3307  | 
6、ENV
在镜像中用于设置环境变量的,然后RUN命令可以使用此设置的环境变量,在容器启动后也以通过docker inspect查看环境变量,可以通过docker run --env key=value来设置或修改环境变量。
#具体使用法如下:
ENV <key> <value>
ENV <key>=<value> ...
| 
 eg:  | 
 ENV JAVA_HOME /usr/local/jdk  | 
| 
 ENV myName="John Doe" myDog=Rex\ The\ Dog \ myCat=fluffy 等同于 ENV myName John Doe ENV myDog Rex The Dog ENV myCat fluffy  | 
7、ADD
(1)、复制指定的源文件、目录、URL到容器的指定目录中。所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0。
(2)、如果源是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;
(3)、如果源文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);
identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压。
(4)、如果源是文件且目标目录中不使用斜杠结束,则会将目标目录视为文件,源的内容会写入目标目录;饭:可以理解成目标目录变为文件了。
(5)、如果源是文件且目标目录中使用斜杠结束,则会源文件拷贝到目标目录下。
#具体使用法如下:
ADD <源> <目标>
| 
 eg:  | 
 ADD hom* /mydir/ # 添加所有以"hom"开头的文件 ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt" ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/ ADD test /absoluteDir # 添加 "test" 到 / 下,并重命名为absoluteDir  | 
8、COPY(同ADD,只是不会解压文件)
复制本地主机的源(默认为Dockerfile所在的目录)到容器中的目标中,目标路径不存在时会自动创建。
#具体使用法如下:
COPY <源> <目标>
COPY web/index.html /var/web/
路径必须是绝对路径,如果不存在,会自动创建对应目录
路径必须是Dockerfile 所在路径的相对路径
如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制
9、ENTRYPOINT
指定容器启动后执行的命令,多行只执行最后一行。并且不可被docker run提供的参数覆盖。
#具体使用法如下:
ENTRYPOINT "command" "param1" "param2" (shell内部命令)
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
| 
 eg:  | 
 FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"] 当启动容器后,你将直接看到相当于运行了top -b -c 要进一步查看,你可以直接使用命令docker exec -it test ps aux 相当于使用了docker exec top -b -it test ps aux  | 
10、VOLUME
创建一个可以从本地主机或其它容器挂载的挂载点,一般用于存放数据。与docker run -v也可以实现此功能。
例如-v ~/opt/data/mysql:/var/lib/mysql将本机的~/opt/data/mysql和容器内的/var/lib/mysql做持久化关联
容器启动时会加载,容器关闭后会回写。
#具体使用法如下:
VOLUME [directory_name]
| 
 eg:  | 
 VOLUME ["/data"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]  | 
11、USER
指定容器运行时使用的用户或UID,后面RUN、CMD、ENTRYPIONT都会使用此用户来运行命令。
#具体使用法如下:
USER [username/uid]
| 
 eg:  | 
 USER 123 或 USER git  | 
12、WORKDIR
指定RUN、CMD、ENTRYPIONT指定的命令的运行目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /data WORKDIR work。最终的路径就是/data/work。path路径也可以是环境变量。
#具体使用方法如下:
WORKDIR [path]
| 
 eg:  | 
 WORKDIR /a (这时工作目录为/a) WORKDIR b (这时工作目录为/a/b) WORKDIR c (这时工作目录为/a/b/c)  | 
13、ONBUILD
配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。
#具体使用法如下:
ONBUILD [INSTRUCTION]
14、LABEL
给镜像添加信息。使用docker inspect可查看镜像的相关信息
  LABEL "com.example.vendor"="ACME Incorporated"
  LABEL
com.example.label-with-value="foo"
  LABEL version="1.0"
  LABEL description="This text
illustrates \
  that label-values can span multiple lines."
当你在命令行执行docker
inspect name时,会发现时key velue键值对类型的。
15、ARG
由外部启动时必须传入的参数,在容器启动时用--build-arg传递参数
指定于外界交互的端口,在容器启动时用-p传递参数
  例如--build-arg
CONT_IMG_VER=v2.0.1
| 
 eg:  | 
 FROM ubuntu  | 
有些默认参数,无需指定,也不用使用``传递,可直接传参
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
(干货)构建镜像之Dockerfile的更多相关文章
- (干货)构建镜像之docker commit
		
Docker提供了两种构建镜像的方法:docker commit命令喝Dockerfile构建文件. docker commit 不推荐 (1).这是手工构建镜像的方式,容易出错,效率低且可重复性 ...
 - docker入门——构建镜像
		
前面我们已经介绍了如何拉取已经构建好的带有定制内容的Docker镜像,那么如何构建自己的镜像呢? 构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker buil ...
 - docker之构建镜像
		
构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker build命令和 Dockerfile 文件. 在这里并不推荐使用docker commit来构建镜像,而 ...
 - Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
		
Dockerfile 是一个文本文件,记录了镜像构建的所有步骤. 第一个 Dockerfile 用 Dockerfile 创建上节的 ubuntu-with-vi,其内容则为: 下面我们运行 dock ...
 - 使用Dockerfile构建镜像-Docker for Web Developers(5)
		
1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...
 - docker(四) 使用Dockerfile构建镜像
		
下面以一个例子来演示构建镜像的过程. #在/tmp目录下演示 cd tmp mkdir build-redis-image 1.创建Dockerfile文件 vim Dockerfile 并写入如下内 ...
 - Docker:dockerfile自动构建镜像 [六]
		
一.手动docker镜像的缺点 相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点: 1.dockerfile只有几kb,便于传输 2.使用dockerfile构建出来的镜 ...
 - Docker系列(三)Dockerfile 离线构建镜像
		
一.Dockfile介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfil ...
 - 使用Dockerfile来构建镜像
		
Dockerfile原理 创建Dockerfile Dockerfile实例 Dockerfile指令 注释 FROM MAINTAINER RUN ADD WORKDIR ENV USER COPY ...
 
随机推荐
- linux中/etc/passwd和/etc/shadow文件说明
			
/etc/passwd是用来存储登陆用户信息: [root@localhost test]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x ...
 - 查询OSD运行在哪些cpu上
			
前言 在看CPU相关的文章的时候,想起来之前有文章讨论是否要做CPU绑定,这个有说绑定的也有说不绑定的,然后就想到一个问题,有去观测这些OSD到底运行在哪些CPU上面么,有问题就好解决了,现在就是要查 ...
 - 编译一个Centos6.4下可用的内核rpm升级包-3.8.13内核rpm包
			
在Centos6.4下进行内核升级,采用内核源码的升级方式比较简单,但是需要升级的机器多的情况下进行内核升级就比较麻烦,并且编译内核的速度依赖于机器的性能,一般需要20分钟,而通过rpm内核包的方式进 ...
 - centos 7.6 虚拟机开启网卡
			
1. 2. > cd /etc/sysconfig/network-scripts 3. > vi ifcfg-enp0s3 上图标红区域,默认值是:no,改为yes:保存. 4. ...
 - 《Spring Boot 实战纪实》之需求管理
			
目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...
 - 微信公众号平台Url Token EncodingAESKey 注意点
			
最近公司让我开发微信公众号平台扫码登录,同步用户信息于PC端,所做的过程当中遇到了一些坑,做完了就总结一下需要注意的点,如若大家开发过程中遇到同样的问题,可以借鉴! 第一:配置域名 作用:配置域名为了 ...
 - Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)
			
漏洞原理 Tomcat配置了两个Connecto,它们分别是HTTP和AJP. HTTP默认端口为8080,处理http请求:AJP默认端口8009,用于处理 AJP 协议的请求. AJP比http更 ...
 - 这几种实现线程的方法你一定要知道,月薪20k以上的面试都会问到
			
实现线程的三种方式总结 最近有看到Java线程的实现相关问题,在此对线程实现方式做一个小小的总结,当做笔记,便于日后查看. 平时常用的线程方式有三种: (1).继承Thread类,并重写其run()方 ...
 - 有什么数据恢复软件可以恢复CF数据
			
虽然现在SD卡出现并且日益流行,但是CF卡(Compact Flash)作为一种存储设备,仍然是专业数码相机的主流标准.不仅是数码相机,CF接口还广泛用于PDA.笔记本电脑和包括台式机在内的各种设备. ...
 - Acwing 245.你能回答这些问题吗
			
题目描述 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1."1 x y",查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y{∑ri=lA[i ...