百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Docker-dockerfile指令介绍

wptr33 2025-01-09 16:34 19 浏览

简介:Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像的定制实际上就是定制每一层所添加的配置、文件。如果可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

本文将介绍Dockerfile指令及其使用方法,详细情况请参考下文。

一、Dockerfile文件格式

说明:Dockerfile分为四部分,基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。比如:

二、Dockerfile 指令详解

1、FROM:指定基础镜像,必须为dockerfile中的第一个命令

格式:

  FROM <image>

  FROM <image>:<tag>

  FROM <image>@<digest>

示例:

  FROM mysql:5.6

注:

tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

2、MAINTAINER: 维护者信息

格式:

MAINTAINER <name>

示例:

MAINTAINER JasonTang

MAINTAINER jasontang@163.com

MAINTAINER jasontang <jasontang@163.com>

3、LABEL:用于为镜像添加元数据

格式:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

示例:

  LABEL version="1.0" description="这是一项软件项目测试工程"

注:

使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

4、RUN:构建镜像时执行的命令,一个文件中可以包含多个RUN命令

RUN用于在镜像容器中执行命令,有以下两种命令执行方式:

①shell执行,即/bin/sh

格式:

RUN <command>

②exec执行

格式:

RUN ["executable", "param1", "param2"]

要注意的是,executable是命令,后面的param是参数

示例: RUN yum install -y nginx

RUN ["yum", "install", "-y", "nginx"]

注意:

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache。

另外:由于RUN命令会生成一个镜像层,所以RUN并不是越多越好,需要合理使用,如果一个RUN中执行多个命令,可以使用 && 连接,如果命令过长,可以使用 \ 换行,例如:

RUN apt-get update && apt-get install -y \

bzr \

cvs \

git \

mercurial \

subversion

并且这样写还有个优点,apt-get update 和 apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 apt-get install 在单独的 RUN 中执行,则会使用 apt-get update 创建的镜像层,而这一层可能是很久以前缓存的。

5、CMD:构建容器后调用,也就是在容器启动时才进行调用,存在多个CMD时只有最后一个生效,也支持exec语法。

格式:

CMD ["executable","param1","param2"] (执行可执行文件,优先)

CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)

CMD command param1 param2 (执行shell内部命令)

示例:

CMD echo "This is a test." | wc -

CMD ["/usr/bin/wc","--help"]

注意:

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

6、ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

格式:

ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)

ENTRYPOINT command param1 param2 (shell内部命令)

示例:

FROM ubuntu

ENTRYPOINT ["top", "-b"]

CMD ["-c"]

注意:

ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

另外:需要注意CMD和ENTRYPOINT的区别

CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:

CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会;如使用CMD ["/bin/bash"]或ENTRYPOINT ["/bin/bash"]后,再使用docker run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用docker run -ti image /bin/bash。

但是如果启动镜像的命令为docker run -ti image /bin/ps,使用CMD后面的命令就会被覆盖转而执行bin/ps命令,而ENTRYPOINT的则不会,而是会把docker run 后面的命令当做ENTRYPOINT执行命令的参数。

7、EXPOSE:指定暴露镜像的端口供主机做映射

格式:

EXPOSE <port> [<port>...]

示例:

EXPOSE 80 443

EXPOSE 8080

EXPOSE 11211/tcp 11211/udp

注意:

EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

8、ENV:设置环境变量

格式:

ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量

ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行

示例:

ENV JAVA_HOME=/usr/jdk

ENV JRE_HOME=$JAVA_HOME/jre

9、ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。如果目的位置不存在,Docker会自动创建所需要的目录。

格式:

ADD <src>... <dest>

ADD ["<src>",... "<dest>"] 用于支持包含空格的路径

示例:

ADD hom* /mydir/ # 添加所有以"hom"开头的文件

ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"

ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/

ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

注意:

需要复制的本地文件一定要放在Dockerfile文件的同级目录下

原因:

因为构建环境将会先上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。ADD指令的目的的位置则必须是容器内部的一个绝对路径。

10、COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。就是不能解压,也不能访问网络资源,其他限制条件跟ADD一样。

格式:

COPY <源路径>... <目标路径>

COPY ["<源路径1>",... "<目标路径>"]

比如:COPY package.json /usr/src/app/

11、VOLUME:添加卷,用于指定持久化目录

格式:

VOLUME ["/path/to/dir"]

示例:

VOLUME ["/data"]

VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

注:

  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

1.卷可以容器间共享和重用;

2.容器并不一定要和其它容器共享卷;

3.修改卷后会立即生效;

4.对卷的修改不会对镜像产生影响;

5.卷会一直存在,直到没有任何容器在使用它。

12、WORKDIR:指定工作目录,类似于cd命令,之后的命令都是基于此工作目录

格式:

WORKDIR /path/to/workdir

示例:

WORKDIR /a (这时工作目录为/a)

WORKDIR b (这时工作目录为/a/b)

WORKDIR c (这时工作目录为/a/b/c)

注意:

通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

13、USER:指定运行容器时的用户名或 UID,后续的操作都会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。

格式:

  USER user

  USER user:group

  USER uid

  USER uid:gid

  USER user:gid

  USER uid:group

示例:

  USER www

注意:

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

14、ARG:用于指定传递给构建运行时的变量

格式:

ARG <name>[=<default value>]

示例:

ARG site

ARG build_user=www

15、ONBUILD:用于设置镜像触发器

格式:

  ONBUILD [INSTRUCTION]

示例:

  ONBUILD ADD . /app/src

  ONBUILD RUN /usr/local/bin/python-build --dir /app/src

注意:

  当所构建的镜像被用做其它镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该镜像中的触发器将会被钥触发。

例如创建镜像image-A FROM ubuntu ... ONBUILD ADD . /var/www ...

然后创建镜像image-B,指定image-A为基础镜像,如 FROM image-A ...

然后在构建image-B的时候,日志上显示如下: Step 0 : FROM image-A # Execting 1 build triggers Step onbuild-0 : ADD . /var/www ...

16、STOPSIGNAL:用于设置停止容器所要发送的系统调用信号

格式:

STOPSIGNAL signal

注意:所使用的信号必须是内核系统调用表中的合法的值,如:SIGKILL。

17、HEALTHCHECK:用于指定某个程序或者指令来监控 docker 容器服务的运行状

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令;

HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令;

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

18、SHELL:用于设置执行命令(shell式)所使用的的默认 shell 类型

格式:

SHELL ["executable", "parameters"]

三、Dockerfile应用实例

1、通过Dockerfile创建Nginx服务器

2、通过Dockerfile创建Tomcat服务器

相关推荐

Python自动化脚本应用与示例(python办公自动化脚本)

Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作...

Python文件操作常用库高级应用教程

本文是在前面《Python文件操作常用库使用教程》的基础上,进一步学习Python文件操作库的高级应用。一、高级文件系统监控1.1watchdog库-实时文件系统监控安装与基本使用:...

Python办公自动化系列篇之六:文件系统与操作系统任务

作为高效办公自动化领域的主流编程语言,Python凭借其优雅的语法结构、完善的技术生态及成熟的第三方工具库集合,已成为企业数字化转型过程中提升运营效率的理想选择。该语言在结构化数据处理、自动化文档生成...

14《Python 办公自动化教程》os 模块操作文件与文件夹

在日常工作中,我们经常会和文件、文件夹打交道,比如将服务器上指定目录下文件进行归档,或将爬虫爬取的数据根据时间创建对应的文件夹/文件,如果这些还依靠手动来进行操作,无疑是费时费力的,这时候Pyt...

python中os模块详解(python os.path模块)

os模块是Python标准库中的一个模块,它提供了与操作系统交互的方法。使用os模块可以方便地执行许多常见的系统任务,如文件和目录操作、进程管理、环境变量管理等。下面是os模块中一些常用的函数和方法:...

21-Python-文件操作(python文件的操作步骤)

在Python中,文件操作是非常重要的一部分,它允许我们读取、写入和修改文件。下面将详细讲解Python文件操作的各个方面,并给出相应的示例。1-打开文件...

轻松玩转Python文件操作:移动、删除

哈喽,大家好,我是木头左!Python文件操作基础在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。...

Python 初学者练习:删除文件和文件夹

在本教程中,你将学习如何在Python中删除文件和文件夹。使用os.remove()函数删除文件...

引人遐想,用 Python 获取你想要的“某个人”摄像头照片

仅用来学习,希望给你们有提供到学习上的作用。1.安装库需要安装python3.5以上版本,在官网下载即可。然后安装库opencv-python,安装方式为打开终端输入命令行。...

Python如何使用临时文件和目录(python目录下文件)

在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。使用标...

Linux 下海量文件删除方法效率对比,最慢的竟然是 rm

Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...

Python 开发工程师必会的 5 个系统命令操作库

当我们需要编写自动化脚本、部署工具、监控程序时,熟练操作系统命令几乎是必备技能。今天就来聊聊我在实际项目中高频使用的5个系统命令操作库,这些可都是能让你效率翻倍的"瑞士军刀"。一...

Python常用文件操作库使用详解(python文件操作选项)

Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...

11. 文件与IO操作(文件io和网络io)

本章深入探讨Go语言文件处理与IO操作的核心技术,结合高性能实践与安全规范,提供企业级解决方案。11.1文件读写11.1.1基础操作...

Python os模块的20个应用实例(python中 import os模块用法)

在Python中,...