本文地址:https://www.cnblogs.com/veinyin/p/10412079.html 

镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是假删除,让人无法访问到,实际上还是存在的。

在以上基础上,谈谈定制镜像。

定制镜像就是在已有的基础镜像上添加层,但是定制每一层添加进去的东西,比如配置、文件等。我们把对每一层的操作放进 Dockerfile 里,这样定制出来的镜像就是一致的。

Dockerfile 中的每一条指令都会创建一层。

Dockerfile 指令

Dockerfile 中,指令不区分大小写,但最好用大写突出每条指令。

FROM:指定基础镜像

 FROM: nginx

MAINTAINER:指定维护者信息

 MAINTAINER: yyh

以上指令有先后顺序,在文件中需按顺序放在第一第二编写!

RUN:执行命令

有 shell 和 exec 两种格式

尽管可以一个 RUN 指令执行一条语句,但这样会创建过多层镜像,是不科学也不必要的,正确写法应该是使用 && 将多条命令连起来。

在每条指令也就是构建每一层之后,必须有清除无关文件的命令,否则镜像会非常臃肿。

tips: '\' 换行, '#' 注释

COPY:复制文件

 COPY sourcePath targetPath

sourcePath 可以是多个,可以是通配符,targetPath 不存在时会自动创建,不用事先创建。

ADD:复制文件 plus

基本同 COPY 的使用方法和功能, ADD 的 sourcePath 可以是一个 URL,会主动下载并自动设置权限为600。

ADD 会使镜像构建缓存失效,可能会导致镜像构建很缓慢。

使用场景判断:如果是单纯复制文件,使用 COPY,如果需要自动解压缩,使用 ADD

CMD:容器启动命令

指定容器启动程序及参数

 CMD <命令>  // shell 格式
CMD ["可执行文件", "参数1", "参数2"...] // exec 格式

推荐使用 exec 格式,会被解析为 JSON 数组,一定要用双引号。

容器中所有应用都应该前台执行,没有后台服务的概念!

ENTRYPOINT 入口点

功能同 CMD,有 shell 和 exec 两种格式

如果存在 ENTERPOINT,CMD 的内容就变成了 ENTERPOINT 的参数。

可能传参就用 ENTRYPOINT,不传参就用 CMD

ENV 设置环境变量

格式如下

 ENV key value  // 一个键值对
ENV key1=value1 key2=value2 // 多个键值对

值有空格时用双引号引起来

使用时用 $key 即可取值。

ARG 构建参数

与 ENV 作用相同,但 ARG 设置的环境变量,在容器运行时不存在

VOLUME 定义匿名卷

格式如下

 VOLUME 路径  // 一个时直接接在后面
VOLUME ["路径1", "路径2"] // 多个路径放进数组

避免运行时用户忘记将动态文件所保存目录挂载为卷,保证容器存储层不会发生写操作

EXPOSE 声明端口

声明容器打算用什么端口,不会自动在宿主进行端口映射

WORKDIR 指定工作目录

USER 指定当前用户

指定用户必须事先建立好

HEALTHCHECK 健康检查

判断容器状态是否正常

 HEALTHCHECK 选项 CMD 命令  // 设置容器健康检查
HEALTHCHECK NONE // 屏蔽检查

选项如下:

  • --interval   检查间隔  默认30秒
  • --timeout  超时时间  默认30秒
  • --retries    指定连续失败次数,超过时将容器视为不健康

ONBUILD 预指令

后面跟着其它指令,当下一级镜像以此镜像为基础镜像时才会被执行

构建镜像

终端进入 Dockerfile 所在目录,输入以下命令构建镜像

 docker build -t imageName:tag .

最后面的 '.' 一定要加上,表示指定上下文路径为当前目录。

镜像其实是在远程服务端构建的,当指定上下文路径后,会将该路径下的所有内容打包,上传给 Docker 引擎,服务器便获取到本地资源。

由于只能从上下文中获取资源,因此 Dockerfile 中必须指定范围内的路径。

在执行 build 后,可以看到输出如下内容,就是在发送我们指定的上下文。

Sending build context to Docker daemon  2.048kB

tips:.dockerignore 文件可以剔除不希望上传到 Docker 引擎的资源

其它构建方法

docker 支持 URL 构建

Git repo 构建

使用 mybranch 分支,myfolder 作为构建上下文构建镜像,不指定分支或 tag 则默认为master,不指定上下文则默认为根目录。

 docker build myrepo.git#mybranch:myfolder

tar 包构建

如果 URL 是 tar 包,Docker 引擎会下载并解压缩,将其作为上下文构建镜像

docker build url

标准输入读取构建镜像

如果标准输入传入的是文本文件,将该文件视为Dockerfile,如果是压缩包,将压缩包视为上下文压缩包,解压后视为上下文构建。

END~~~≥ω≤ 

最新文章

  1. 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序
  2. vs2012中VC连接mysql
  3. 使用Coookie实现浏览器显示上次的登录时间
  4. html5新特性之音频、视频
  5. iOS- 利用AFNetworking(AFN) - 实现图片上传
  6. IEF could not decode Chinese character in IE history well
  7. SqlServer将日期格式DateTime转换成varchar类型
  8. Book for Opencv
  9. 可选参数、命名参数、.NET的特殊类型、特性
  10. 201521123020 《Java程序设计》第9周学习总结
  11. fullpage.js的easing参数怎样配置自定义动画
  12. Linux查看服务器配置
  13. PRBS
  14. leetcode26: 删除排序数组中的重复项
  15. Git的初步学习
  16. MySql数据库中敏感字段加密处理方案
  17. Mysql远程连接报错:SQL Error (1130): Host &#39;192.168.61.128&#39; is not allowed to connect to this MySQL server
  18. [AngularJS] Angular 1.3 ngMessages with ngAnimate
  19. Loadrunner windows计数器
  20. Qt5.4 webview 不能打开网址

热门文章

  1. 1086. Tree Traversals Again (25)-树的遍历
  2. 2-Seventeenth Scrum Meeting-20151217
  3. 每日Scrum(8)
  4. ELK Stack (1) —— ELK + Redis安装
  5. Docker(二十四)-Docker使用Portainer搭建可视化界面
  6. [51CTO]服务器虚拟化开源技术主流架构之争
  7. android管理SD卡 mksdcard
  8. Spring之AOP实现原理
  9. Git push -u orign master 提示hint: not have locally. This is usually caused by another repository push
  10. FFT自看