千家信息网

如何正确的使用Dockerfile命令

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家介绍如何正确的使用Dockerfile命令,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 FROM ---指定基础镜像基础镜像不存在会在Docker Hub上拉去
千家信息网最后更新 2026年11月03日如何正确的使用Dockerfile命令

这篇文章给大家介绍如何正确的使用Dockerfile命令,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1 FROM ---指定基础镜像

基础镜像不存在会在Docker Hub上拉去
使用格式:
FROM <镜像>:[tag]
FROM <镜像>@digest[校验码]
当前主机没有此镜像时,会自动去官网HUB下载
..............................................

2 MAINTANIER --提供Dockerfile 制作者提供本人信息

[逐渐废弃]
LABLE --替代MAINTANIER
具体使用:
LABLE maintainer="作者信息"

使用格式:

MAINTANIER "guowei <597599150@qq.com>"

.......................................................

3 COPY --把宿主机中的文件复制到镜像中去!

文件要在Dockerfile工作目录
src 原文件
--支持通配符
--通常相对路径
dest 目标路径
--通常绝对路径

有空白字符隔开的字串需要用"",否则会被当做两个文件!

文件复制准则:
1 src必须是build上下文中的路径,不能是其父目录
2 如果src是目录,则其内部文件或子目录会被递归复制
但src目录自身不会被复制
3 如果指定了多个src,或在src中使用了通配符,则dest必须是一个
目录,且必须以/结尾
4 如果dest实现不存在,它将会被自动创建,这包括其父目录
..............................................................

4 ADD --类似COPY命令

支持URL路径----如果可以访问网络的话,会访问网络下载
到本地然后打包进镜像!

操作准则:
1 如果src为URL且dest不以/结尾,则src指定的文件将被下载并
直接被创建为dest;如果dest以/结尾,则文件名URL指定的文件
将被直接下载并保存为dest/filename

2 如果是压缩包会被解压,但通过URL路径获取到的tar文件不会被展开

3 如果src有多个,或其间接或直接使用了通配符,则dest必须是一个
以/结尾的目录路径,如果dest不以/结尾,则其被视为一个普通文件
src的内容将被直接写入到dest中!

...............................................................

5 WORKDIR --指定工作目录

每次只会影响这个指令后续的指令

ADD nginx-1.14.2.tar.gz /usr/local/src/ --不受影响

WORKDIR /usr/local/src/

ADD nginx-1.14.2.tar.gz ./ --受影响

.............................................................

6 VOLUME --卷

只能定义docker管理的卷:
VOLUME /data/mysql

运行的时候会随机在宿主机的目录下生成一个卷目录!
................................................................

7 EXPOSE 为容器打开指定要监听的端口以实现与外部通信

使用格式:
EXPOSE 80/tcp 23/udp

不加协议默认为tcp

使用-P选项可以暴露这里指定的端口!
但是宿主的关联至这个端口的端口是随机的!
..............................................................

8 ENV

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于
其后的其它命令所调用

调用格式:
$A 或 ${A}

ENV
ENV =

第一种格式中,key之后的所有内容均会被其视作的组成部分
因此,一次只能设置一个变量!

第二种格式可用一次设置多个变量,每个变量为一个=
的键值对,如果中包含空格,可以反斜线(\)进行转义
也可以通过对加引号进行标识。另外,反斜线也可用于续航

定义多个变量时。建议使用第二种方式,以便在同一层中完成所有功能
具体用法:
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/

ENV A /web/html

COPY index.html ${A:-/web/html}

在docker run 中传递变量:
docker run -e [list] 传变量值
如果在dockerfile中赋值变量后也能在docker run中继续赋值
docker run --name b1 --rm -e A=xx [镜像ID]
不会影响docker build 的过程!

printenv --输出环境变量信息

..............................................................

9 RUN命令:

使用格式:
RUN
RUN ["","",""]

第一种格式中 来运行它
这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使用docker stop命令
来停止容器时,此进程接收不到信号

第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令,后面的
为传递给命令的选项或参数,然而,此种格式指定的命令不会以"/bin/sh -c">来运行它
因此常见的shell操作如变量替换以及通配符替换将不会进行 不过如果要运行的命令依赖于
此shell特性的话,可以将其替换为下面的格式:
RUN ["/bin/bash","-c","",""]

........................................................................

10 CMD命令:运行于docker run中

语法有三种写法
1. CMD ["executable","param1","param2"] --启动为ID为1的进程
具体实例:

CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html]

2. CMD ["param1","param2"]
3. CMD command param1 param2 --直接运营为shell的子进程
param*=执行参数
例如第二种:
CMD ["nginx"]

docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx

只能是双引号!

CMD ["param1","param2"]
--此种用法用于为ENTRYPOINT指令提供默认参数

可用于执行脚本:
添加脚本:

ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh

RUN chmod +x /apps/tomcat/bin/run_tomcat.sh

RUN chown -R tomcat:tomcat /apps /data/tomcat

CMD ["/apps/tomcat/bin/run_tomcat.sh"] -- 引用脚本!

..............................................................

11 ENTRYPOINT

类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独
的可执行程序

与CND不同的是,由这个指令启动的程序不会被docker run 命令行指定的参数所覆盖
而且,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序

使用格式:

ENTRYPOINT
ENTRYPOINT ["","",""]

docker run 命令传入的命令参数会覆盖CMD指定的内容并且附加到ENTRYPOINT
命令最后作为其参数使用

Dockerfile文件中也可以存在多个此指令,但仅有最后一个生效!

在docker run时,使用--entrypoint string选项传递的命令 可以覆盖Dockerfile中
定义的ENTRYPOINT指令

如何让Nginx配置文件接收参数

创建一个脚本:

#!/bin/bash
#
cat > /etc/nginx/conf.d/www.conf <server {
server_name ${HOSTNAME};
listen ${IP:-0.0.0.0}:${PORT:-80};
root ${ROOT:-/web/html};
}
EOF
exec "$@"
chmod +x nginx-conf.sh

Dockerfile文件:

FROM xxx
ENV ROOT='/web/html/'
ADD index.html ${ROOT}
ADD nginx-conf.sh /bin/nginx-conf.sh
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/nginx-conf.sh"]
docker run --name b1 --rm -P -e "PORT=8080" [镜像ID]

注意:必须使用双引号!!!
................................................................................

12 USER命令:

用于指定运行image时的或运行Dockerfile中的任何RUN,CMD或ENTRYPOINT
指令指定的程序时的用户名或UID

默认情况下,container的运行身份为root

格式:
USER |

需要注意的是可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效
UID否则docker run命令将运行失败!

必须要在容器中的/etc/passwd文件中个存在

....................................................................

13 HEALTHCHECK

健康状态监测
HEALTHCHECK NONE --不要做监测

常用选项:
--interval=DURATION 默认30秒 --多长时间监测一次
--timeout=DURATION 默认30秒 --监测超时时间
--start-period=DURATION --当docker容器启动后,延迟多长时间才健康检查
默认0秒
--retries=N 默认3次
默认检查多少次在认为失败

响应值:
0--成功
1--失败
2--自定义

应用示例:

HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit1

Dockerfile中应用:

HEALTHCHECK --start-period=3s CMD wget -O - -q http://{IP:-0.0.0.0}:${PORT:-80}/

也可以在docker run中定义:

--health-cmd string
--health-interval duration
--health-retries int
--health-start-period duration
--health-timeout duration

.................................................................

14 SHELL指令:

["cmd","/S","/C"] --windons

...........................................................

15 STOPSIGNAL命令:

STOPSIGNAL 信号名称

定义停止命令的信号!

SIGKILL --9信号

.............................................................

16 ARG参数:

用于docker build 的过程中使用

可以被--buil-arg当做参数传递过来!
具体应用:

ARG auther=tim
LABLE maintainer=${auther}
docker build --build-arg auther=tom -t xxx ./

在dockerfile中存在的arg变量,如果在docker build 时也
设置了--build-arg变量,这样最终以命令行界面的变量值为
最终值!
.................................................................

17 ONBUILD

用于在dockerfile中定义一个触发器
dockerfile用于build映像文件,此映像文件亦可作为base image被另一个
dockerfile用作from指定的参数,并以之构建新的影响文件

在后面的这个dockerfile中的from指定在build过程中被执行时,将会触发
创建其base image的dockerfile文件的ONBUILD指定定义的触发器

格式:
ONBUILD 要执行的Dockerfile指令

尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套
且不会触发from和maintainer指令

使用包含onbuild指定的dockerfile构建的镜像应该使用特殊的标签
例如ruby:2.0-onbuild

在onbuild指令中使用add或copy指令硬格外小心,因为构建过程的上下文
在缺少指定的源文件时会失败!

关于如何正确的使用Dockerfile命令就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

命令 文件 指令 格式 参数 变量 运行 目录 镜像 容器 路径 信号 内容 多个 程序 影响 端口 脚本 过程 进程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技股互联网 与互联网科技公司 狮子座互联网科技 南京欣网互联网科技 成都仁贤领冠互联网科技有限公司 开启互联网科技时代小说 科技赋能互联网健康 科技与互联网的利与弊 剑昆互联网络科技有限公司临桂 汽车互联网创新科技园 湖北码尼互联网科技有限公司电话 互联网科技公司实习生 宜昌元轩互联网科技有限公司 苏州铭阳互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 互联网科技圈年度人物 互联网科技资金流入 科技和互联网行业的特点 现代科技的标志之一的互联网 伍佰万互联网科技是干嘛的 上海喔噻互联网科技有限公司 互联网科技工作委员会 重庆互联网络科技 善班互联网科技有限公司 互联网科技公司名称 移动互联网科技股 苏州铭阳互联网科技有限公司 互联网科技研发水平 盐城市攀科互联网科技有限公司 互联网科技企业文化
0