千家信息网

docker中dockerfile语法如何使用

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章将为大家详细讲解有关docker中dockerfile语法如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。FROM关键字指定基础镜像,并
千家信息网最后更新 2025年12月03日docker中dockerfile语法如何使用

这篇文章将为大家详细讲解有关docker中dockerfile语法如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

  • FROM关键字

指定基础镜像,并且必须是第一条指令。如果不以任何镜像为基础,那么写法为:FROM scratch。同时意味着接下来所写的指令将作为镜像的第一层开始,语法:

FROM FROM :FROM :

三种写法,其中 是可选项,如果没有选择,那么默认值为latest,为了安全,尽量使用官方image作为base image

例:

FROM scratch #制作base imageFROM centos  #以centos作为base image
  • LABEL关键字

为镜像指定标签,语法:

LABEL = = = ...

一个Dockerfile种可以有多个LABEL,如下:

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."

但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号

如下:

LABEL multi.label1="value1" \multi.label2="value2" \other="value3"

说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

例:

LABEL maintainer="asd@163.com"  #维护者信息LABEL version="1.0"             #版本LABEL description="这是描述"     #镜像描述信息
  • RUN关键字

功能为运行指定的命令,每运行一次RUN对image而言都生成新的一层,RUN命令有两种格式

1. RUN 2. RUN ["executable", "param1", "param2"]

第一种后边直接跟shell命令

  • 在linux操作系统上默认 /bin/sh -c

  • 在windows操作系统上默认 cmd /S /C

第二种是类似于函数调用。可将executable理解成为可执行文件,后面就是两个参数。

两种写法比对:

  • RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME


  • RUN ["/bin/bash", "-c", "echo hello"]


注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

当命令较多,或较长时,建议将命令换行,RUN书写时的换行符是 \

例:

RUN yum update && yum install -y vim \    python-dev
RUN apt-get update && apt-get install -y perl \    pwgen --no-install-recommends && rm -rf \    /var/lib/apt/list/*
  • WORKDIR关键字

设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。相当于 cd,如果不存在要打开的目录则会创建,可以设置多次。语法:

WORKDIR /path/to/workdir

例:

WORKDIR /ROOT  #将工作目录切换到root下
WORKDIR /test  #将工作目录切换到test目录  没有则创建WORKDIR demo   #结合上一句 此时工作目录被切换到/test/demo目录下

尽量使用WORKDIR,而不使用RUN cd,尽量使用局对目录。

  • ADD关键字

一个复制命令,把文件复制到镜像中。如果把宿主机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。语法如下:

1. ADD ... 2. ADD ["",... ""]

路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径

可以是一个本地文件或者是一个本地压缩文件,还可以是一个url,如果把写成一个url,那么ADD就类似于wget命令,ADD不仅可以添加一个文件到指定目录,而且还可以将添加的压缩文件解压缩,

如以下写法都是可以的:

  • ADD test relativeDir/   #将test复制到容器内,相对于当前工作目录下的relativeDir目录中


  • ADD test /relativeDir  #将test复制到容器内根目录下relativeDir目录中


  • ADD http://example.com/foobar /   #将网络文件下载到根目录下


尽量不要把写成一个文件夹,如果是一个文件夹了,将复制整个目录的内容,包括文件系统元数据

有如下注意事项:

1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。

2、如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。

3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。

4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。

  • COPY关键字

看这个名字就知道,又是一个复制命令,与ADD用法基本相同,COPY的只能是本地文件,语法如下:

1. COPY ... 2. COPY ["",... ""]

例:

ADD hello /  #将hello文件复制到容器内根目录下ADD test.tar.gz /   #将压缩文件添加到容器内根目录下并解压
WORKDIR /root  #将工作目录切换到root目录下ADD hello test/   #将hello文件添加到/root/test目录下
WORKDIR /root  #将工作目录切换到root目录下copy hello test/ #将hello文件复制到/root/test
  • ENV关键字

功能为设置环境变量设置常量,语法有两种:

1. ENV  2. ENV = ...

两者的区别就是第一种是一次设置一个,第二种是一次设置多个。

例:

ENV MYSQL_VERSION 5.6 #设置常量RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \   #使用常量    && rm -rf /var/lib/apt/list/*
  • CMD关键字

功能为容器启动时要运行的命令,语法有三种写法

1. CMD ["executable","param1","param2"]2. CMD ["param1","param2"]3. CMD command param1 param2

第三种比较好理解了,就时shell这种执行方式和写法,第一种和第二种其实都是可执行文件加上参数的形式,举例说明两种写法:

  • CMD [ "sh", "-c", "echo $HOME"


  • CMD [ "echo", "$HOME" ]


补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号,原因是参数传递后,docker解析的是一个JSON array

注意事项:

  • 容器启动时默认执行的命令

  • 如果docker run 指定了其他命令,CMD命令被忽略

  • 如果定义了多个CMD,只有最后一个会执行

  • RUN & CMD

不要把RUN和CMD搞混了。RUN是构件容器时就运行的命令以及提交运行结果,CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

  • ENTRYPOINT关键字

功能是启动时的默认命令,语法如下:

1. ENTRYPOINT ["executable", "param1", "param2"]2. ENTRYPOINT command param1 param2

与CMD比较说明(这俩命令太像了,而且还可以配合使用):

1. 相同点:

  • 只能写一条,如果写了多条,那么只有最后一条生效

  • 容器启动时才运行,运行时机相同

2. 不同点:

  • ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖

  • 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数

  • shell格式:即把要运行的命令当做shell执行

RUN apt-get install -y vimCMD echo "hello docker"ENTRYPOINT echo "hello docker"
  • Exec格式:即是 命令,参数格式

RUN ["apt-get", "install", "-y", "vim"]CMD ["/bin/echo", "hello docker"]ENTRYPOINT ["/bin/echo", "hello docker"]

例:以下两个dockerfile结果相同

FROM centos  #指定基础镜像为centosEVN name Docker   #设定常量name 值为DockerENTRYPOINT echo "hello $name"  #执行acho命令

以上dockerfile生成的镜像运行容器时输出 hello Docker

FROM centos  #指定基础镜像为centosEVN name Docker   #设定常量name 值为DockerENTRYPOINT ["/bin/echo", "hello $name"]  #执行acho命令

以上dockerfile生成的镜像运行容器时输出 hello $name,因为 ENTRYPOINT ["/bin/echo", "hello $name"] 指定容器启动时运行的就是echo命令 不会识别$为变量,做如下修改:

FROM centos  #指定基础镜像为centosEVN name Docker   #设定常量name 值为DockerENTRYPOINT ["/bin/bash", "-c", "echo", "hello $name"]  #在shell中执行acho命令

容器启动时输出 hello Docker

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

文件 目录 命令 路径 容器 目标 镜像 运行 语法 关键 关键字 工作 写法 内容 参数 基础 常量 相同 切换 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 高斯数据库怎样查询表结构 网络安全班会说课 高性能数据库集群分析 非关系型数据库的易懂理解 海通证券软件开发中心人数 数据库记录 陕西惠普服务器维修哪家便宜 安卓开发用哪个数据库 二手软件开发的前景有哪些 论文收录万数据库有哪些 系统和网络安全保障服务能开票嘛 苏州共创网络技术有限公司 arma3服务器怎么进不去 数据库思政作业 广东报考网络安全工程师证书 石油化工概算应用数据库2017 游侠饥荒已在服务器登录 id设置数据库类型吗 不同的数据库用的语言相同么 空间数据库设计的步骤 代理服务器 收费 tt数据库 客户端工具 数据库代码注释规范 淮安app应用软件开发公司 数据库去掉不间断空格 软件开发计划项目安全性 典型的计算机网络安全技术 财务app软件开发 微信语音说话无法连接到服务器 浙江诚信网络技术服务常见问题
0