CMD中有啥常用的命令,写五六个吧,谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMD中有啥常用的命令,写五六个吧,谢谢相关的知识,希望对你有一定的参考价值。
dos下各种常见命令索引dos下各种常见命令索引
▲ dir
▲ attrib
▲ cd
▲ copy
▲ xcopy
▲ del
▲ undelete
▲ deltree
▲ dos=high
▲ doskey
▲ emm386.exe
▲ fc
▲ format
▲ unformat
▲ interlnk
▲ intersvr
▲ memmaker
▲ memitem等
▲ mscdex
▲ msd
▲ prompt
▲ ramdrive
▲ subst
▲ mem
▲ "> < >> <<"工具
▲ move
▲ append
▲ call
▲ defrag
▲ device
一、DIR 命令的格式:
dir [D:][PATH][NAME][[/A][:attrib]][/o:[sorted][/s][/b][/l][/c[h]
(1)dir /a:attrib 缺省包含所有文件(系统文件.隐含文件)
attrib[:][h/-h]只显示隐含文件或非隐含文件.
[r/-r]只显示只读文件或非只读文件
[s/-s]只显示系统文件或非系统文件
[a/-a]只显示要归档文件或非归档文件
(2)/o[:]sorted:缺省完全按字母顺序,子目录显示在文件之前
/o[n/-n]:按字母顺序或按文件名顺序/反向显示
[e/-e]:按扩展名字母顺序/反向显示
[d/-d]:按时间顺序/反向显示
[s/-s]:按大小从大到小或/反向显示
[g/-g]:按子目录先于文件或文件先于子目录
(3)/s 参数:对当前目录及其子目录中所有文件进行列表
列名:dir /s/a/o:n c:\>PRN
将c盘上的所有子目录和文件按隶属关系并根据子目录和文件字母顺序打印输出
(4)/B 参数:将只显示文件名与扩展名
(5)/L 参数:将全部用小写字母对文件或子目录进行列表
训练:
dir /a 列当前目录所有文件(含隐含及系统文件)
dir /ah 列隐含文件(包含子目录(隐含的) dir /a-h
dir /as 列系统文件 dir /a-s
dir /ad 列子目录 dir /a-d
dir /o 按字母顺序
dir /B 只显示文件名与扩展名
二、attrib [+r|-r] [+a|-a] [+s|-s] [+h|-h] [d: ] [name] [/s]
缺省 attrib name 显示文件的(文件)属性
attrib io.sys (或子目录)
shr c:\ io.sys 指定为系统(s) 隐含(h) 只读(r)文件
也可以attrib *.sys 显示扩展名为sys的文件属性
参数 [+r|-r] 将文件属性设置或解除 只读属性
[+a|-a] 将文件属性设置或解除 归档属性
[+h|-h] 将文件属性设置或解除 隐含属性 (尤其对子目录也起作用)
/s 参数 将当前及当前子目录下的所有文件均起作用
可以用来查找文件
例子:
attrib news86 列news86的文档属性
attrib +r report.txt 设置为只读 attrib -s -h record.txt
attrib +a a:*.*
attrib -a a:*.bak
xcopy a: b: /a 将A盘上的所有标志为"归档"属性的文件拷到B盘
xcopy a: b: /m 将A盘上的所有文件拷到B盘后并移去归档属性
三、cd 介绍: cd...返回上二级目录 "."代表当前目录 "."代表父目录
cd ..\..返回到上级目录的父目录(祖目录)
cd A:\ 将A盘的当前目录改为根目录
cd A:\xx 将A盘的当前目录改为子目录xx下
cd ..\98 先返回父目录,再进入父目录下的98子目录
cd ..返回到父目录
cd\98 进入根目录下的98子目录
四、copy [/y][/-y][/v][ /B]
copy /y 不加提示,对所有文件加以覆盖
/-y 加以提示,对所有文件 (yes或no提问 )
/v 拷贝以后加以校验
/B 按二进制进行显示
copy w1.wps con/b 可以将wps文件在屏幕上显示,而不必进入wps状态
copy ..\98 将父目录下的98子目录下的所有文件全拷到当前子目录
copy .\97 当当前目录下的97子目录下文件全部拷到当前目录
copy . c:\ 将当前目录下的所有文件拷到c盘根目录
. 意味着 *.* 文件
copy nul a.abc 将a.abc 文件清空(文件长度改为0)
copy 文件名+con 向文本文件中追加命令或内容
copy con 文件名 创建文本文件(F6存盘退出)
copy con prn 检测打印机的开关
五、xcopy命令
xcopy [source] [d:date] [/p] [/s] [/e] [/v] [/y]
xcopy [d:date] xcopy a:b:\ /d:08/18/98/s/v 拷贝98.08.18年后的文件
xcopy [/p] 提示创建子目录
xcopy [/s] 连带子目录一起拷贝. 注意:若目标盘上不存在此子目录,而在目标
盘的结束符又不以"\"为结束,则将提示:
does destination specify a file name or directory name on the target
[f=file,d=directory]?
在目标盘上创建文件[按下]还是创建子目录[按下d] ?应选择d键
xcopy[/v] 带较验
*:(1) xcopy 不拷贝系统和隐含文件,应先予以修改属性再拷贝
xcopy [/y] 覆盖时是否有提示, /y 不带提示
若省略目标盘或子目录名,则拷贝到当前目录下
六、 del /p
加/p 可以在删除前是否提示
如del后加子目录名,则将子目录下所有文件(隐含.系统.只读文件除外)全删除,
加/p则可以确认.
七、undelete [name] /au
不加提示地将所有满足条件的文件恢复(能够恢复的),并将首字母置成"#",若已
存在,则按"# % & 0 1 2-9 a-z"顺序加上.
如:undelete *.dbf/au 将扩展名为"dbf"的文件全恢复,并以"#"开头,作为文件
名, /list 仅列出可恢复的文件,而不恢复
undelete /load 将undelete装入内存
/unload 将undelete卸出内存
/s[drive]对指定驱动器进行监测管理
undelete/sc
将 undelete驻留内存,?并创建一个隐含的sentry 子目录对c盘删除的文件进行
管理 undelete/ds 恢复
相应恢复命令可以用undelete即可完整恢复出文件名(非常完整)
最常用undelete *.*
deltree /y [drive:path]
deltree 删除子目录及文件,尽管有些文件是系统文件或隐含文件
它可以带有通配符,带有通配符时,它将删除符合条件的文件及子目录
如:?undelete *.dbf/au 将扩展名为"dbf"的文件全恢复,并以"#"开头作为文件
名.
/list 仅列出可恢复的文件,而不作恢复操作.
undelete/load 将undelete 装入内存.
/unload将undelete 卸出内存.
/s[drive] 对指定的驱动器进行监视管理.
undelete/sc 将undelete 驻留内存,并创建一个隐含的sentry子目录对C盘删除
的文件进行管理.相应恢复命令可以用undelete/ds 即可完整恢复出文件名(很完善).
最常用的是undelete *.*
八、deltree /y [drive:path]
deltree 删除子目录及文件,尽管有些文件是系统或隐含的.
它可以带有通配符,这时它将删除符合条件的文件或子目录.
如:存在L1文件,L2子目录,L3文件,L4子目录
deltree L*.* 将删除以上所有的文件和子目录,但在删除前加以确认,若不删除,
可以输入"N".
/y 参数是在删除时不加以确认就进行操作的.
它删除的文件可以用undelete恢复,?但不能恢复子目录及其下的文件,可以用特
殊工具.如NORTON 8.0 等.
若提前使用了undelete/s,?则可以在sentry子目录下找到完整的文件,但名已经
改变了.
九、dos=high[|low[umb|noumb]]
dos=high,umb 则dos将自身装入高端内存(high)并能管理上位内存(umb).
noumb 则不管理上位内存.
在写入dos=high及umb 前应装入device=himem.sys
为了将程序或驱动程序装入上位内存,必须使用dos=umb,可省出大部分常规内存.
可以在config.sys的任何位置写上dos=high,umb
若显示hma not avoiable 或 load down low 则表明不能使用高端内存.
十、doskey 记录以前敲过的dos命令,可以用F7来显示,用"↑↓"来选择,用F9来输入
选择的命令号.
doskey/restall 重新装入一次,以前的命令行撤消.
doskey/history 显示内存中所有的命令,可以">"显示到其它文件中,缩写"/H".
doskey dir=cls 则击入dir等同于cls一样.
doskey/macros 可显示所有的宏定义,可使用">"重定义到文件中,可缩写"/M".
doskey dir= 可撤消对dir 的宏定义.
doskey p=dir$tdir*.exe/p$tdir c:\t$tdir c:\t$*
$t为命令的区分符,而$*为命令的结束符
doskey/insert(overstrike)?在重新输入命令时,对旧命令的修改是插入还是覆
盖状态(默认).
十一、emm386.exe
提供对扩展内存的管理,使应用程序象使用常规内存一样能够使用它.
常见的用法是 在config.sys 中
device=c:\dos\himem.sys
device=c:\dos\emm386.exe ram
d=64 将DMA 内存数量设置为64K
noems 提供对上位内存的访问,但不提供对扩展内存的访问.
应注意的是在windows中最好不要用它,因为windows本身有对扩展内存进行管理
的程序.应采用windows中的管理器.
十二、fc 命令 fc/b dt.dat dt2.dat>b (作二进制代码比较)
比较两个文件,一般用作存取进度,修改游戏存储文件用.
实际代码位置应加上0100 如:0000 05E4:00 67
实际用debug -e 修改时应加上0100 即 0000 06E4:00 67
后面加上重定向文件">P" 可以将比较结果输出到p文件中.
十三、format /q /u /s /n:sectors /f:size /c
/q参数:快速格式化,仅扫描文件分配表和根目录区,仅对格式化过的磁盘有效.
使用时应确保格式化过后没有增加新的坏道.
/u参数:无条件格式化,并且不保存原来盘上的信息,可以防止"unformat".
/s参数:格式化为系统盘,也可以使用"sys"命令.
/f:size size 可以为160 180 320 360 720 1200 1440 2800
/n:sector n可以为1 格式为单面盘,容量为160k 180k
可以为4 可以在5寸高密驱动器上格式化360k磁盘
可以为8 可以在5寸高密驱动器上进行8个扇区的格式化.
/c 重新测试坏扇区,缺省时如果一个扇区标记为"坏",以后格式时就不在从新测
试,仅作标记,使用"/C"时可以从新测试.
十四、unformat 命令
对用format 格式过,且未用"/u"参数的命令起作用,用它可以来重新修复已经损
坏的硬盘分区表,但对网络盘不起作用.
unformat drive:[/l][/test][/p]
/l 显示每一个被unformat发现的文件和子目录,如果没有这个开关,只显示那些
破碎的文件和子目录,可以用ctrl+s 暂停,按任意键继续.
/test 仅作一个测试,不作实际的修复工作,作模拟过程.
/p 一边测试一边打印.
注:这种方法不能保证修复所有的文件,尤其是格式化后又添加过数据的磁盘.
恢复后的文件依次存放在subdir1....2....3等子目录中.
十五、interlnk 语法 interlnk g=e ,它可以通过串口或并口在两机间进行通讯.
将服务器端上的e驱动器映射为客户端的g驱动器,以后对客户端而言,所有对g的
操作都意味着对服务器的访问,取消映射的办法为interlnk g=
单独输入interlnk 则显示所有的映射情况.
注意:interlnk 必须在装入interlnk.exe 设备驱动程序才可以使用.
所用的驱动器符号与config.?sys中lastdrv.exe设置的数目有关.可以作一个一
端为25针,另一端为9针的串行线实现,具体接线方式如下:
5 - 7 2 - 15
3 - 2 3 - 13
7 - 4 4 - 12
6 - 6 5 - 10
3 - 3 6 - 11
8 - 5 15 - 2
4 - 20 13 - 3
9针 25针 12 - 4
10 - 5
11 - 6
25 - 25
25针 25针
十六、interlnk.exe 与intersvr.exe
interlnk.exe 重新定向对于客户驱动器或打印接口的请求到另外的服务器驱动
器或打印机.
语法:config.sys 中加入:
device=c:\dos\interlnk.exe [drive:n][/noprinter][com][lpt]
十七、memmaker[/b][/batch][session][/swap:drive]
使用memmaker能够优化内存配置,?并将配置写入autoexec.bat和config.sys中.
在这一过程中,需要重新启动几次机器.
十八、memitem memcolor memdefault submenu 菜单选项include
autoexec.bat 中如下: config.sys中如下:
path c:\dos;c:\ucdos [menu]
doskey menucolor=15,1(前景色15,背景色1)
\mouse\mouse menuitem=base_config,this is a base
goto %config% ->选择项 menuitem=cced_config,this is a cced
选项 提示
:base_config menudefault=base_config,5
goto exit ->跳出 缺省为base_config,延迟时间5秒
:cced_config [common]
c:\dos\smartdrv.exe /l device=c:\dos\himem.sys
goto exit 各项都包含的共同部分
:exit ->结束 [base_config]
device=c:\dos\emm386.exe ram
dos=high,umb
[cced_config]
device=c:\dos\smartdrv.exe/double_buffer
include=base_config 包含base_config设置
可以根据计算机的在不同情况下的配置要求来选择.
十九、mscdex.exe 提供对光驱进行读写的程序
mscdex/d:drive [/D:drive][/e][/k][/s][/l:letter]
典型:config.sys 中device=c:\cdrom\cdrom.sys /d:mscd000
autoexec.bat中 c:\dos\mscdex /d:mscd000 /l:g
配置了一个光驱,符号为g
参数/d:drive1为光驱身份号,须与config.sys中的符号一致,可有多个
/d:mscd000 /d:mscd001
/e:使用扩展内存装入光驱驱动程序.
/s:使光驱在ms_net或windows是否设置为共享光驱
/V是否在加载时显示内存.
/L:letter 分配给光驱的盘符
/m:number 指定缓冲器的数目
应该注意的是:?如果用smartdrv.exe 加速对光驱的读写能力,应该在autoexec.
bat中将mscdex.?exe 写在smartdrv.exe 之前,smartdrv.exe的使用可大幅提高
对驱动器的读写能力.
二十、msd的使用
使用msd 可以整体检查计算机配置及系统信息
包括:?驱动器参数,计算机cpu参数,内存大小参数,显示器类型,串.并口情况,以
及各个IRQ占用情况,据此可以分析新增设备是否与原来设备有冲突.
同时也可以通过分析内存驻留程序,判断内存中是否有病毒,有则标为"???".
二十一、prompt dos提示符
$q 等于号 $t 当前时间 $d 当前日期 $p 当前驱动器符号
$$ $号提示 $n当前驱动器 $g 大于号 $l小于号 $b 显示"|"管道号
$h 隐去提示符 $E显示"<-"号
对于其它文字,则直接显示文本本身prompt ljw,则显示为ljw提示符
prompt 则仅显示当前驱动器号及大于号.
二十二、ramdrive.sys 使用内存当做虚拟盘来使用
应注意,所有数据都存在于内存中,应及时将其存到硬盘中,否则掉电后或者死机
后将丢失全部数据,优点是运行速度快,但不能在windows中使用.
示例:config.sys: device=c:\dos\ramdrive.sys /size[/e|a]
size为以k为单位的字节数,即建立的虚拟盘的大小.
/e或/a 都是使用扩展内存来建立虚拟盘,?加参数的前提是必须先加载内存管理
器himem.sys及emm386.exe.
二十三、subst 将一个驱动器与一个子目录联接
如:将对A:\l1\l2 子目录的请求映射为S盘,则输入
subst s: a:\l1\l2 即可
这样使用dir s:?等命令则显示的是a:\l1\l2子目录下的内容,其它copy del 一样
可以用subst s: d 来取消这种映射.
可以用subst 来显示各种联接情况
注意:?可以采用subst a: c:a 来建立一个对于A的读写盘.对于某些安装软件
来说,?必须使用A盘来安装,就可以使用先将所要安装的软件全部拷贝到C:a子
目录中,然后输入subst a: c:a,再转到A:,就可以进行软件的安装了.
二十四、mem /c /m /p /d 常规内存显示程序
/c显示所有内存驻留程序的占用情况,分为conventional常规内存和uppermemory
高端内存占用,并显示总的占用情况(常规 高端 保留 扩展内存)
/p分页显示,页间暂停
/m后加模块名 如:/m msdos 显示dos系统内存的占用.
/d对常规 高端 保留 扩展内存加以详细例表说明
通过分析,可以看出内存占用是否合理,以及各种程序是否正常加载,从而在此基
础上使用内存优化工具memmaker进行各种管理,同时又可以分析出一些程序死机
的原因,若有的地方显示"???",则可以断定内存中有病毒的存在,有利于发现及消灭.
二十五、各种管道工具的使用"> < >> <<"
将各种命令造成的输出或所需要的输入重新定向
如:dir *.bat /b>p 可以将dir *.bat 例出的文件名输出到p文件中.
time<p>>p.bat
p文件中仅存在一个回车符,则可以将时间追加进p.bat文件中
"> >>" 是将命令产生的输出重新定向,比如到文件或打印机中.
>>产生的内容将追加进文件中,>则将原文件内容覆盖.
"< <<" 是将命令所需要输入的内容重新定向.
如:time<p 在批中可以是时间代码或回车符,可以以此改变时间.
需要说明的是 "prn "为打印机, "null"为空设备
con 为显示器
type p.bat>prn 可将p.bat打印出来.
copy null p 可将p文件删除掉
copy con p 可以在屏幕上编辑p文件,F6可以存盘退出
type p>pp 完成p文件到pp 的复制
type p|more 可在屏满时暂停显示
二十六、move 命令
move [y/-y] filename1 filename2
将文件1移动到文件2处
如:move c:\dos\*.* c:\cced
将dos子目录下的所有文件全部移动到cced 子目录下
/y|-y参数在目标目录不存在需要创建时,是否出现提示
可以使用该命令修改子目录名称,如 move dos cced
将dos目录名改为cced
二十七、append 指定一些特殊数据文件的存放位置,如user.dat pe2.pro等一些非*.
exe *.com *.bat 文件
格式:append [:]终止以前存在的指定目录 append 显示指定情况
append [path] append c:\user 等
二十八、
call 在一个批处理命令中调用另外一个批处理文件
(1)不终止现有文件的运行,执行完掉用程序后立即返回.
(2)被调用批处理命令必须以bat 为扩展名
(3)调用批处理文件时,可以加上参数(%1-%9)以及环境变量如%baud%
(4)不能使用管道工具及重定向工具
二十九、device devicehigh loadhigh
device 将指定的设备驱动程序装入内存中
devicehigh将指定的设备驱动程序装入高端内存中
loadhigh 将指定的设备驱动程序装入高端内存中
三十、defrag 优化磁盘
legend(传奇) optimize(优化) elapse(逝去) fragment(碎片)
该命令执行对指定的盘进行优化处理(包括检查文件分配表,各文件状态,纠正错
误),在执行时,可按照文件名大小,时间,扩展名对文件进行排序. 参考技术A net use \ipipc$ " " /user:" " 建立IPC空链接
net use \ipipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: \ipc$ "密码" /user:"用户名"
直接登陆后映射对方C:到本地为H:
net use h: \ipc$ 登陆后映射对方C:到本地为H:
net use \ipipc$ /net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup ***istrators 用户名 /add
把“用户”添加到管理员中使其具有管理员权限,注意:***istrator后加s用复数
net start 查看开启了哪些服务
net start 服务名 开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time \目标ip 查看对方时间
net time \目标ip /set
设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view \ip 查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip "文本信息" 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip
查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip
对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名)
跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。
ping ip(或域名)
向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。
ping -t -l 65550 ip
死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95
98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息
tlist -t
以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名
加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文
件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR
*.*”表示删除当前目录下所有只读文件,“DEL/A-S
*.*”表示删除当前目录下除系统文件以外的所有文件 参考技术B dir
cd cd.. cd/
ipconfig
ping
copy
del
ping本回答被提问者采纳 参考技术C 汗死 参考技术D ping [-t] ping [-a] ping [-n count] ping [-l size] ping [-f] ping [-i TTL] ping [-v TOS]
Dockerfile 中的 CMD 和 ENTRYPOINT 有啥区别?
【中文标题】Dockerfile 中的 CMD 和 ENTRYPOINT 有啥区别?【英文标题】:What is the difference between CMD and ENTRYPOINT in a Dockerfile?Dockerfile 中的 CMD 和 ENTRYPOINT 有什么区别? 【发布时间】:2014-02-28 11:21:48 【问题描述】:在 Dockerfiles 中有两个与我相似的命令:CMD
和 ENTRYPOINT
。但我想它们之间存在(细微的?)差异——否则,对同一件事有两个命令是没有任何意义的。
CMD
的文档说明
CMD 的主要目的是为正在执行的容器提供默认值。
对于ENTRYPOINT
:
ENTRYPOINT 可帮助您配置可以作为可执行文件运行的容器。
那么,这两个命令有什么区别呢?
【问题讨论】:
^ 那个!谢谢@slm。这是另一个非常相似的参考资料,可能会更新一些:docs.docker.com/reference/builder/#entrypoint 和the difference betweenADD
and COPY
一样令人困惑
此链接提供了 RUN、CMD 和 ENTRYPOINT 之间的区别:goinbigdata.com/docker-run-vs-cmd-vs-entrypoint
请注意CMD
和ENTRYPOINT
都有不同的写法,exec和shell形式。因此,请帮自己一个忙,并根据所使用的形式了解行为的细微差异。然后阅读docs.docker.com/engine/reference/builder/…。
我觉得这个phoenixnap.com/kb/docker-cmd-vs-entrypoint解释的很清楚。
【参考方案1】:
CMD 和 ENTRYPOINT 的区别凭直觉:
ENTRYPOINT:容器启动时运行的命令。 CMD:容器启动时运行的命令或 ENTRYPOINT 的参数(如果指定)。是的,这令人困惑。
您可以在运行 docker run 时覆盖其中任何一个。
CMD 和 ENTRYPOINT 的区别举例:
docker run -it --rm yourcontainer /bin/bash <-- /bin/bash overrides CMD
<-- /bin/bash does not override ENTRYPOINT
docker run -it --rm --entrypoint ls yourcontainer <-- overrides ENTRYPOINT with ls
docker run -it --rm --entrypoint ls yourcontainer -la <-- overrides ENTRYPOINT with ls and overrides CMD with -la
更多关于CMD
和ENTRYPOINT
之间的区别:
docker run
的参数(例如 /bin/bash)会覆盖我们在 Dockerfile 中编写的任何 CMD 命令。
ENTRYPOINT 不能在运行时被docker run [args]
等普通命令覆盖。 docker run [args]
末尾的 args
作为 ENTRYPOINT 的参数提供。这样我们就可以创建一个container
,它就像一个普通的二进制文件,比如ls
。
所以 CMD 可以作为 ENTRYPOINT 的默认参数,然后我们可以从 [args] 覆盖 CMD args。
ENTRYPOINT 可以用--entrypoint
覆盖。
【讨论】:
【参考方案2】:有一些很好的答案。我想通过Doc的demo来解释一下
CMD
定义容器的默认命令和/或参数。如果您需要用户可以轻松覆盖的默认命令,CMD 是最好使用的指令。 如果一个 Dockerfile 有多个 CMD,它只应用最后一个的指令。
ENTRYPOINT
在您想要定义具有特定可执行文件的容器时首选。
除非添加--entrypoint
标志,否则在启动容器时不能覆盖ENTRYPOINT
。
-
CMD
Docker 文件
FROM centos:8.1.1911
CMD ["echo", "Hello Docker"]
运行结果
$ sudo docker run <image-id>
Hello Docker
$ sudo docker run <image-id> hostname # hostname is exec to override CMD
244be5006f32
-
入口点
Docker 文件
FROM centos:8.1.1911
ENTRYPOINT ["echo", "Hello Docker"]
运行结果
$ sudo docker run <image-id>
Hello Docker
$ sudo docker run <image-id> hostname # hostname as parameter to exec
Hello Docker hostname
-
在很多情况下,将 CMD 和 ENTRYPOINT 结合起来是 Docker 容器的最佳解决方案。在这种情况下,可执行文件使用 ENTRYPOINT 定义,而 CMD 指定默认参数。
Docker 文件
FROM centos:8.1.1911
ENTRYPOINT ["echo", "Hello"]
CMD ["Docker"]
运行结果
$ sudo docker run <image-id>
Hello Docker
$ sudo docker run <image-id> Ben
Hello Ben
【讨论】:
【参考方案3】:我遇到了这个问题,一开始我发现说实话真的很混乱,我认为这种混乱来自使用“CMD”这个词,因为实际上那里的内容作为参数。所以在挖掘了一点之后,我明白了它是如何工作的。基本上:
ENTRYPOINT --> 您在此处指定的是容器启动时要执行的命令。如果你省略这个定义,docker 将使用/bin/sh -c bash
来运行你的容器。
CMD --> 这些是 附加到 ENTRYPOINT 的参数,除非用户指定了一些自定义参数,即:docker run ubuntu <custom_cmd>
在这种情况下,而不是附加指定的内容在 CMD 部分的图像上,docker 将运行ENTRYPOINT <custom_cmd>
。如果没有指定 ENTRYPOINT,这里的内容将传递给/bin/sh -c
,实际上作为启动容器时要执行的命令。
作为一切,最好通过示例来解释正在发生的事情。因此,假设我使用以下规范 Dockerfile 创建了一个简单的 docker 映像:
From ubuntu
ENTRYPOINT ["sleep"]
然后我通过运行以下命令来构建它:
docker build . -t testimg
这将创建一个容器,每次运行时它都会休眠。所以如果我按以下方式运行它:
docker run testimg
我会得到以下内容:
sleep: missing operand
Try 'sleep --help' for more information.
这是因为入口点是需要参数的“睡眠”命令。所以要解决这个问题,我只需提供睡眠量:
docker run testimg 5
这将正确运行,因此容器将运行,休眠 5 秒并退出。正如我们在这个示例中看到的,docker 只是将图像名称后面的内容附加到入口点二进制文件docker run testimg <my_cmd>
。如果我们想将默认值(默认参数)传递给入口点会发生什么?在这种情况下,我们只需要在 CMD 部分中指定它,例如:
From ubuntu
ENTRYPOINT ["sleep"]
CMD ["10"]
在这种情况下,如果用户不传递任何参数,容器将使用默认值 (10) 并将其传递给入口点 sleep。
现在让我们只使用 CMD 并省略 ENTRYPOINT 定义:
FROM ubuntu
CMD ["sleep", "5"]
如果我们重建并运行这个镜像,它基本上会休眠 5 秒。
因此,总而言之,您可以使用 ENTRYPOINT 来使您的容器充当可执行文件。您可以使用 CMD 为入口点提供默认参数,或在启动容器时运行自定义命令,用户可以从外部覆盖该命令。
【讨论】:
【参考方案4】:根据docker docs,
CMD 和 ENTRYPOINT 指令都定义了要执行的命令 运行容器时。很少有规则可以描述他们的 合作。
Dockerfile 应至少指定
CMD
或ENTRYPOINT
命令之一。ENTRYPOINT
应在将容器用作可执行文件时定义。CMD
应该用作为ENTRYPOINT
命令定义默认参数或在 容器。CMD
将在使用替代参数运行容器时被覆盖。
下表显示针对不同ENTRYPOINT
/ CMD
组合执行的命令:
-- No ENTRYPOINT
╔════════════════════════════╦═════════════════════════════╗
║ No CMD ║ error, not allowed ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD ["exec_cmd", "p1_cmd"] ║ exec_cmd p1_cmd ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD ["p1_cmd", "p2_cmd"] ║ p1_cmd p2_cmd ║
╟────────────────────────────╫─────────────────────────────╢
║ CMD exec_cmd p1_cmd ║ /bin/sh -c exec_cmd p1_cmd ║
╚════════════════════════════╩═════════════════════════════╝
-- ENTRYPOINT exec_entry p1_entry
╔════════════════════════════╦══════════════════════════════════╗
║ No CMD ║ /bin/sh -c exec_entry p1_entry ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD ["exec_cmd", "p1_cmd"] ║ /bin/sh -c exec_entry p1_entry ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD ["p1_cmd", "p2_cmd"] ║ /bin/sh -c exec_entry p1_entry ║
╟────────────────────────────╫──────────────────────────────────╢
║ CMD exec_cmd p1_cmd ║ /bin/sh -c exec_entry p1_entry ║
╚════════════════════════════╩══════════════════════════════════╝
-- ENTRYPOINT ["exec_entry", "p1_entry"]
╔════════════════════════════╦═════════════════════════════════════════════════╗
║ No CMD ║ exec_entry p1_entry ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD ["exec_cmd", "p1_cmd"] ║ exec_entry p1_entry exec_cmd p1_cmd ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD ["p1_cmd", "p2_cmd"] ║ exec_entry p1_entry p1_cmd p2_cmd ║
╟────────────────────────────╫─────────────────────────────────────────────────╢
║ CMD exec_cmd p1_cmd ║ exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd ║
╚════════════════════════════╩═════════════════════════════════════════════════╝
【讨论】:
什么是 px_cmd 和 exec_entry ?当它们在同一条执行线上时是什么意思?它们作为参数传递给对方?即使涉及/bin/sh -c
?
@Danielo515 'px_cmd' 和 'exec_entry' 在这里都只是虚拟字符串。您可能只是注意到/bin/sh -c
将作为前缀添加到 CMD 中,而 CMD 以可执行语法(而不是列表语法)编写。
ENTRYPOINT exec_entry p1_ent
被错误解释了。 shell 形式阻止使用任何 CMD 或运行命令行参数 - docs.docker.com/engine/reference/builder/#entrypoint
@MariuszMiesiak 现在更新了。感谢您的反馈。
顺便说一句:这个答案绝对应该是公认的答案! (而the current one 声称“Docker 有一个默认入口点是/bin/sh -c
”......)【参考方案5】:
• Dockerfile 应至少指定一条 CMD 或 ENTRYPOINT 指令
• 仅使用 Dockerfile 中的最后一个 CMD 和 ENTRYPOINT
• 将容器用作可执行文件时应定义 ENTRYPOINT
• 您应该使用 CMD 指令来定义默认参数 定义为 ENTRYPOINT 的命令或用于在 容器
• 使用替代参数运行容器时将覆盖 CMD
• ENTRYPOINT 设置每次访问时使用的具体默认应用程序 容器是使用图像创建的
• 如果将 ENTRYPOINT 与 CMD 结合,则可以从 CMD 中删除可执行文件 并留下将传递给 ENTRYPOINT 的参数
• ENTRYPOINT 的最佳用途是设置图像的主命令,允许 要像运行该命令一样运行图像(然后使用 CMD 作为默认值 标志)
【讨论】:
【参考方案6】:我将添加我的答案作为示例1,这可能有助于您更好地理解差异。
假设我们想要创建一个在启动时始终运行睡眠命令的图像。我们将创建自己的图像并指定一个新命令:
FROM ubuntu
CMD sleep 10
构建镜像:
docker build -t custom_sleep .
docker run custom_sleep
# sleeps for 10 seconds and exits
如果我们想改变秒数怎么办?我们将不得不更改Dockerfile
,因为该值在那里是硬编码的,或者通过提供不同的值来覆盖命令:
docker run custom_sleep sleep 20
虽然这可行,但它不是一个好的解决方案,因为我们有一个多余的“睡眠”命令。为什么要冗余?因为容器的唯一目的是睡眠,所以必须显式指定sleep
命令有点尴尬。
现在让我们尝试使用ENTRYPOINT
指令:
FROM ubuntu
ENTRYPOINT sleep
此指令指定容器启动时将运行的程序。
现在我们可以运行了:
docker run custom_sleep 20
默认值呢?嗯,你猜对了:
FROM ubuntu
ENTRYPOINT ["sleep"]
CMD ["10"]
ENTRYPOINT
是要运行的程序,传递给容器的值会附加到它上面。
可以通过指定--entrypoint
标志覆盖ENTRYPOINT
,后跟要使用的新入口点。
不是我的,我曾经看过一个提供这个例子的教程
【讨论】:
这里是教程的链接:youtu.be/OYbEWUbmk90。它可能对未来的用户有用。 谢谢!这个例子的解释对我(docker初学者)来说比接受的答案要清楚得多。 我认为这个答案是最好的。对我来说,作为 Docker 中的菜鸟,这比其他答案要清楚得多。 我能在网上找到的最佳解释。非常感谢!【参考方案7】:我已阅读所有答案,我想总结一下,以便乍一看更好地理解,如下所示:
首先,在容器中执行的整个命令包括两部分: 命令和参数
ENTRYPOINT 定义了容器运行时调用的可执行文件 开始(用于命令)
CMD 指定传递给 ENTRYPOINT 的参数(用于参数)
在Kubernetes In Action 书中指出了有关它的重要说明。 (第 7 章)
虽然你可以使用 CMD 指令来指定你想要的命令 想在镜像运行的时候执行,正确的做法是做 通过 ENTRYPOINT 指令并如果您只指定 CMD 想要定义默认参数。
您也可以阅读this文章,以简单的方式获得很好的解释
【讨论】:
【参考方案8】:Dockerfile 最佳实践的官方文档很好地解释了这些差异。 Dockerfile best practices
CMD:
应使用 CMD 指令以及任何参数来运行映像中包含的软件。 CMD 应该几乎总是以CMD ["executable", "param1", "param2"…]
的形式使用。因此,如果映像用于服务,例如 Apache 和 Rails,您将运行类似 CMD ["apache2","-DFOREGROUND"]
的内容。事实上,这种形式的指令推荐用于任何基于服务的图像。
入口点:
ENTRYPOINT 的最佳用途是设置图像的主命令,允许该图像像该命令一样运行(然后使用 CMD 作为默认标志)。
【讨论】:
【参考方案9】:Dockerfile
文件中提到的CMD
命令可以通过docker run
命令覆盖,而ENTRYPOINT
不能。
【讨论】:
docker run --help
命令另有说明:--entrypoint string Overwrite the default ENTRYPOINT of the image
【参考方案10】:
这里大部分人都解释得很好,所以我不会重复所有的答案。但为了获得良好的感觉,我建议您自己通过查看容器中的进程来测试它。
创建一个很小的 Dockerfile 格式:
FROM ubuntu:latest
CMD /bin/bash
构建它,使用docker run -it theimage
运行它并在容器中运行ps -eo ppid,pid,args
。
将此输出与您在使用时从 ps 收到的输出进行比较:
docker run -it theimage bash
使用ENTRYPOINT /bin/bash
重建映像并以两种方式运行它
使用CMD ["/bin/bash"]
...
这样您就可以很容易地看到自己所有可能的方法之间的差异。
【讨论】:
【参考方案11】:Docker 有一个默认入口点 /bin/sh -c
,但没有默认命令。
当你像这样运行 docker 时:
docker run -i -t ubuntu bash
入口点是默认的/bin/sh -c
,图像是ubuntu
,命令是bash
。
命令通过入口点运行。即,实际执行的是/bin/sh -c bash
。这使得 Docker 能够依靠 shell 的解析器快速实现RUN
。
后来,人们要求能够自定义这个,所以引入了ENTRYPOINT
和--entrypoint
。
上例中ubuntu
之后的所有内容都是命令并被传递到入口点。当使用CMD
指令时,就像你在做docker run -i -t ubuntu <cmd>
一样。 <cmd>
将是入口点的参数。
如果您改为键入此命令docker run -i -t ubuntu
,您也会得到相同的结果。由于 ubuntu Dockerfile 指定了默认 CMD,您仍将在容器中启动 bash shell:CMD ["bash"]
由于所有内容都传递到入口点,因此您可以从图像中获得非常好的行为。 @Jiri 示例很好,它展示了如何将图像用作“二进制”。当使用["/bin/cat"]
作为入口点然后执行docker run img /etc/passwd
时,你明白了,/etc/passwd
是命令并被传递到入口点,所以最终结果执行只是/bin/cat /etc/passwd
。
另一个例子是将任何 cli 作为入口点。例如,如果你有一个 redis 映像,而不是运行 docker run redisimg redis -H something -u toto get key
,你可以简单地拥有 ENTRYPOINT ["redis", "-H", "something", "-u", "toto"]
,然后像这样运行同样的结果:docker run redisimg get key
。
【讨论】:
一点也不。 ENTRYPOINT 设置在运行时可以(但可以被覆盖)的元数据,因此如果您不更改任何内容,启动容器后,结果将是相同的,但是,RUN 将在构建时执行,无论您做什么在运行时做,它会在这里。 默认没有ENTRYPOINT
;是否使用shell取决于CMD
命令(docs.docker.com/engine/reference/builder/#cmd)的使用形式。
感谢这一点,历史背景对我有很大帮助,因为我正在努力记住关于什么被覆盖和附加什么等看似晦涩难懂的规则。对于世界各地的技术文档作者来说,一个有用的观点:帮助读者建立系统的心智模型,不要只列出事实和场景:-)
这是一个绝妙的答案。我认为 Docker 文档应该在 CMD
vs ENTRYPOINT
的部分下添加它。
@Webman 不,它们是两个不同的指令。如果两者都存在,则 CMD 将被视为 ENTRYPOINT 的参数。【参考方案12】:
公认的答案在解释历史方面非常出色。我发现这张表从official doc on 'how CMD and ENTRYPOINT interact' 解释得很好:
【讨论】:
【参考方案13】:评论code中的EntryPoint函数
// 入口点 /usr/sbin/nginx.
// 将入口点(默认为 sh -c)设置为 /usr/sbin/nginx。
// 将接受 CMD 作为 /usr/sbin/nginx 的参数。
文档中的另一个参考
您可以使用 ENTRYPOINT 的 exec 形式设置相当稳定的默认命令和参数,然后使用 CMD 设置更可能更改的其他默认值。
示例:
FROM ubuntu:14.04.3
ENTRYPOINT ["/bin/ping"]
CMD ["localhost", "-c", "2"]
构建:sudo docker build -t ent_cmd .
CMD arguments are easy to override.
NO argument (sudo docker -it ent_cmd) : ping localhost
argument (sudo docker run -it ent_cmd google.com) : ping google.com
.
To override EntryPoint argument, you need to supply entrypoint
sudo docker run -it --entrypoint="/bin/bash" ent_cmdd
附注: 在存在 EntryPoint 的情况下,CMD 将保存要馈送到 EntryPoint 的参数。 在没有 EntryPoint 的情况下,CMD 将是将要运行的命令。
【讨论】:
【参考方案14】:简而言之:
CMD 设置默认命令和/或参数,可以在 docker 容器运行时从命令行覆盖。 ENTRYPOINT 命令和参数不会被命令行覆盖。相反,所有命令行参数都将添加到 ENTRYPOINT 参数之后。如果您需要更多详细信息或想了解示例的不同之处,请参阅博客文章,通过大量示例全面比较 CMD 和 ENTRYPOINT - http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/
【讨论】:
这是一个很棒的链接!【参考方案15】:CMD:
CMD ["executable","param1","param2"]
:["executable","param1","param2"]
是第一个进程。
CMD command param1 param2
:/bin/sh -c CMD command param1 param2
是第一个进程。 CMD command param1 param2
是从第一个进程派生出来的。
CMD ["param1","param2"]
:此表单用于为ENTRYPOINT
提供默认参数。
ENTRYPOINT(以下列表不考虑 CMD 和 ENTRYPOINT 一起使用的情况):
ENTRYPOINT ["executable", "param1", "param2"]
:["executable", "param1", "param2"]
是第一个进程。
ENTRYPOINT command param1 param2
:/bin/sh -c command param1 param2
是第一个进程。 command param1 param2
是从第一个进程派生出来的。
正如creack 所说,CMD 是最先开发的。然后 ENTRYPOINT 被开发用于更多的定制。由于它们不是一起设计的,所以 CMD 和 ENTRYPOINT 之间存在一些功能重叠,这常常使人们感到困惑。
【讨论】:
【参考方案16】:ENTRYPOINT
指定了在容器启动时始终执行的命令。
CMD
指定将提供给ENTRYPOINT
的参数。
如果你想制作一个专用于特定命令的图像,你将使用ENTRYPOINT ["/path/dedicated_command"]
否则,如果您想为通用目的制作图像,则可以不指定 ENTRYPOINT
并使用 CMD ["/path/dedicated_command"]
,因为您可以通过向 docker run
提供参数来覆盖该设置。
例如,如果您的 Dockerfile 是:
FROM debian:wheezy
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]
不带任何参数运行图像将ping localhost:
$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.096 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.088 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.088/0.091/0.096/0.000 ms
现在,使用参数运行图像将 ping 参数:
$ docker run -it test google.com
PING google.com (173.194.45.70): 48 data bytes
56 bytes from 173.194.45.70: icmp_seq=0 ttl=55 time=32.583 ms
56 bytes from 173.194.45.70: icmp_seq=2 ttl=55 time=30.327 ms
56 bytes from 173.194.45.70: icmp_seq=4 ttl=55 time=46.379 ms
^C--- google.com ping statistics ---
5 packets transmitted, 3 packets received, 40% packet loss
round-trip min/avg/max/stddev = 30.327/36.430/46.379/7.095 ms
为了比较,如果你的 Dockerfile 是:
FROM debian:wheezy
CMD ["/bin/ping", "localhost"]
在没有任何参数的情况下运行图像将 ping 本地主机:
$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.087 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.090 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.076/0.084/0.090/0.000 ms
但是运行带有参数的图像会运行参数:
docker run -it test bash
root@e8bb7249b843:/#
有关更多详细信息,请参阅 Brian DeHamer 的这篇文章: https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/
【讨论】:
The ENTRYPOINT specifies a command that will always be executed when the container starts. The CMD specifies arguments that will be fed to the ENTRYPOINT.
是一个很好的中肯总结。
ENTRYPOINT 也可以使用 --entrypoint 标志覆盖。例如 docker run -it --entrypoint bash test
我喜欢你的例子,真的很有帮助!
@Jingguo Yao:如果CMD中包含-CMD ["nginx","-g","daemon","off"]这样的命令怎么办?会被锁链吗?
ENTRYPOINT
通常指向一个条目 script(而不是命令),它可以做许多有用的事情,例如:在执行之前验证需求(例如对依赖项的就绪性探测) ;代理/包装一个命令来验证它,或者更改执行用户,或者更改文件的所有者(例如,在 Minikube 上挂载 hostPath
时,默认情况下文件会被 UID/GID @ 覆盖987654338@)等。【参考方案17】:
是的,这是个好问题。我还没有完全理解,但是:
我知道ENTRYPOINT
是正在执行的二进制文件。您可以通过 --entrypoint="" 覆盖入口点。
docker run -t -i --entrypoint="/bin/bash" ubuntu
CMD 是容器的默认参数。没有入口点,默认参数是执行的命令。使用入口点, cmd 作为参数传递给入口点。您可以使用入口点模拟命令。
# no entrypoint
docker run ubuntu /bin/cat /etc/passwd
# with entry point, emulating cat command
docker run --entrypoint="/bin/cat" ubuntu /etc/passwd
因此,主要优点是使用入口点可以将参数 (cmd) 传递给容器。为此,您需要同时使用两者:
# Dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/cat"]
和
docker build -t=cat .
那么你可以使用:
docker run cat /etc/passwd
# ^^^^^^^^^^^
# CMD
# ^^^
# image (tag)- using the default ENTRYPOINT
【讨论】:
@Blauhirn 在您的情况下,您必须以列表语法向 CMD 添加参数,并确保您指定的入口点可以解析 CMD 中的参数。通常,我会在入口点添加一个“-h”参数。然后我可以执行docker run image_name -h
来显示这个图像的一些帮助信息。以上是关于CMD中有啥常用的命令,写五六个吧,谢谢的主要内容,如果未能解决你的问题,请参考以下文章