Dockerfile详解(一)
Dockerfile 用于自动化构建一个docker镜像。Dockerfile里有 CMD 与 ENTRYPOINT 两个功能咋看起来很相似的指令,开始的时候觉得两个互用没什么所谓,但其实并非如此:
CMD指令:
The main purpose of a CMD is to provide defaults for an executing container.
CMD在容器运行的时候提供一些命令及参数,用法如下:
- CMD ["executable","param1","param2"] (exec form, this is the preferred form)
- CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
- CMD command param1 param2 (shell form)
- 第一种用法:运行一个可执行的文件并提供参数。
- 第二种用法:为ENTRYPOINT指定参数。
- 第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。
如你指定:
- CMD [“/bin/echo”, “this is a echo test ”]
build后运行(假设镜像名为ec):
- docker run ec
就会输出: this is a echo test
是不是感觉很像开机启动项,你可以暂时这样理解。
注意点:
docker run命令如果指定了参数会把CMD里的参数覆盖: (这里说明一下,如:docker run -it ubuntu /bin/bash 命令的参数是指/bin/bash 而非 -it ,-it只是docker 的参数,而不是容器的参数,以下所说参数均如此。)
同样是上面的ec镜像启动:
docker run ec /bin/bash
就不会输出:this is a echo test,因为CMD命令被”/bin/bash”覆盖了。
ENTRYPOINT
字面意思是进入点,而它的功能也恰如其意。
An ENTRYPOINT allows you to configure a container that will run as an executable.它可以让你的容器功能表现得像一个可执行程序一样。
容器功能表现得像一个可执行程序一样,这是什么意思呢?
直接给个例子好说话:
例子一:
使用下面的ENTRYPOINT构造镜像:
- ENTRYPOINT ["/bin/echo"]
那么docker build出来的镜像以后的容器功能就像一个/bin/echo程序:
比如我build出来的镜像名称叫imageecho,那么我可以这样用它:
- docker run -it imageecho “this is a test”
这里就会输出”this is a test”这串字符,而这个imageecho镜像对应的容器表现出来的功能就像一个echo程序一样。 你添加的参数“this is a test”会添加到ENTRYPOINT后面,就成了这样 /bin/echo “this is a test” 。现在你应该明白进入点的意思了吧。
例子二:
ENTRYPOINT ["/bin/cat"]
构造出来的镜像你可以这样运行(假设名为st):
- docker run -it st /etc/fstab
这样相当: /bin/cat /etc/fstab 这个命令的作用。运行之后就输出/etc/fstab里的内容。
ENTRYPOINT有两种写法:
写法一:
- ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)
写法二:
- ENTRYPOINT command param1 param2 (shell form)
你也可以在docker run 命令时使用–entrypoint指定(但是只能用写法一)。
下面是我把ENTRYPOINT设为[“/bin/sh -c”]时候运行的情况:
- linux-oj9e:/home/lfly/project/docker # docker run -it t2 /bin/bash
- root@4c8549e7ce3e:/# ps
- PID TTY TIME CMD
- 1 ? 00:00:00 sh
- 9 ? 00:00:00 bash
- 19 ? 00:00:00 ps
可以看到PID为1的进程运行的是sh,而bash只是sh的一个子进程,/bin/bash只是作为 /bin/sh -c后面的参数。
CMD可以为ENTRYPOINT提供参数,ENTRYPOINT本身也可以包含参数,但是你可以把那些可能需要变动的参数写到CMD里而把那些不需要变动的参数写到ENTRYPOINT里面例如:
- FROM ubuntu:14.10
- ENTRYPOINT ["top", "-b"]
- CMD ["-c"]
把可能需要变动的参数写到CMD里面。然后你可以在docker run里指定参数,这样CMD里的参数(这里是-c)就会被覆盖掉而ENTRYPOINT里的不被覆盖。
注意点1:
ENTRYPOINT有两种写法,第二种(shell form)会屏蔽掉docker run时后面加的命令和CMD里的参数。
注意点2:
网上有资料说ENTRYPOINT的默认值是[”/bin/sh -c”],但是笔者在试验的时候得到的结果并不是这样的。
笔者使用ENTRYPOINT [“/bin/sh -c”] 指令构造一个以/bin/sh -c为进入点的镜像,命名为sh,然后我可以这样运行:
- docker run -it sh “while(ture ) do echo loop; done”
运行结果就是无限输出loop。但如果直接运行一个ubuntu:14.10镜像,情况不是这样的:
- docker run -it ubuntu:14.10 “while(ture ) do echo loop; done”
得到这样的错误:
- linux-oj9e:/home/lfly # docker run -it ubuntu:14.10 “while(true) do echo this; done” 2014/11/16 18:07:53 Error response from daemon: Cannot start container 4bfe9c6faeec3ed465788a201a2f386cb1af35aba197dbc78b87c0d5dda1f88e: exec: “while(true) do echo this; done”: executable file not found in $PATH
可以猜想默认情况下ENTRYPOINT并不是[“/bin/sh -c”]。
而且直接运行ubuntu:14.10列出程序也可以看到PID为1的程序并不是sh。所以更否定了网友的说法,ENTRYPOINT并不默认为[“/bin/sh -c”] 。
原文出自:http://www.programfish.com/blog/?p=151
Dockerfile详解(一)的更多相关文章
- Dockerfile详解
Dockerfile详解 利用Dockerfile文件,可以构建docker的image镜像 命令使用 通过-f参数指定Dockerfile路径,进行构建image docker build -f / ...
- 【转】Dockerfile详解
Dockerfile详解 https://blog.csdn.net/wo18237095579/article/details/80540571 --------------------- 作者:大 ...
- Dockerfile详解及优化
Dockerfile详解 0. Dockerfile的作用 docker可以根据Dockerfile中的指令来构建docker镜像.Dockerfile是一个文本文件,其应当包含用户想要构建一个镜像的 ...
- Dockerfile详解(二)
Dockerfile文件详解 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指 ...
- k8s记录-Dockerfile详解
Dockerfile命令详解 下面我们来分别介绍下上面使用到的命令: FROM 格式:FROM 或FROM :. 解释:FROM必须是Dockerfile里的第一条指令(注视除外),后面跟有效的镜像名 ...
- Dockerfile详解,以及构建自定义镜像
Dockerfile使用 前面的操作我们一直下载下载官方已经构建好的镜像,直接下载后就可以run,如果我们想要在镜像中添加自己的应用,比如在tomcat中添加自己的app,构建一个自定义的镜像,那么我 ...
- Apache Dolphin Scheduler - Dockerfile 详解
Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统.简称 DS,包括 Web 及若干服务,它依赖 PostgreSQL 和 Zookeep ...
- Docker 学习7 Dockerfile详解
一.镜像的生成途径 1.使用当前进程替换上一个进程 exec 2.生成方式 3.dockerfile制作镜像要求 a.要有专有的工作目录. b.要有专门的制作文件,文件名首字母大写 c.如果要打包很多 ...
- Docker系列07—Dockerfile 详解
本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...
- 7、Dockerfile详解
参考: https://www.imooc.com/article/details/id/25229 https://www.cnblogs.com/panwenbin-logs/p/8007348. ...
随机推荐
- 【每日一题】Squares UVA - 201 暴力+输出坑 + 读文件模板
题意 给你n*n的图,让你数正方形 题解:暴力for每个点,对于每个点从它出发顺时针走一个正方形.走完就ans[i]++; 坑:多输了一行******,然后在那里手摸样例,无限debug orz #d ...
- XPC connection interrupted
用Analysis 静态分析代码,发现了一些问题,修改之后,然后用Instrument -> Leaks对内存做动态分析,发现一个错误: 控制台报错:XPC connection interru ...
- hash_map
点开一道第是自己oj的第440大关,想a了,一直想却无果,学长一句点醒,开始写hash. 关于这道题呢很无语了,两天卡在这上面,而且有些dalao不到20min就a了.我太菜了. 所以要深入讨论这道题 ...
- 【Mysql数据库访问利器】phpMyadmin
缘由 我们程序员难免要和数据库打交道,经过这几年的锻炼,感觉手写SQL语句已经忘记的差不错了,促使我一定要这篇文章的原因是,有一次晚上我更新某个系统的数据库的表(由于目前公司比较严格,数据库都只能通过 ...
- Monkey测试执行_真机测试(2)
提:按照前面的<Monkey环境搭建>先把环境搭建好. 此处为真机测试: 1.首先需要将手机连接到PC,测试连接是否正常,可在cmd里输入adb devices来进行验证: 2.输入adb ...
- tensorflow入门笔记(二) 滑动平均模型
tensorflow提供的tf.train.ExponentialMovingAverage 类利用指数衰减维持变量的滑动平均. 当训练模型的时候,保持训练参数的滑动平均是非常有益的.评估时使用取平均 ...
- 【Python基础】json.dumps()和json.loads()、json.dump()和json.load()的区分
json文件处理涉及的四个函数json.dumps()和json.loads().json.dump()和json.load()的区分 一.概念理解 1.json.dumps()和json.loads ...
- 封装 vue 组件的过程
首先,组件可以提升整个项目的开发效率.能够把页面抽象成多个相对独立的模块,解决了我们传统项目开发的缺点:效率低,难维护,复用性等问题: 然后,使用Vue.extend方法创建一个组件,然后使用 Vue ...
- zabbix准备:mysql安装
php在编译时需要mysql的配置,这样PHP远程连接mysql才有用.1.创建mysql用户和相关目录(配置文件里设置的目录) groupadd mysql useradd -g mysql -M ...
- Android Studio 下载与安装配置
一.下载 Android Studio下载链接:http://www.android-studio.org/ 1.进入安卓中文社区官网进行下载. 2.下载完成. 二.安装与配置环境 1.选择“此电脑” ...