Dockerfile常用指令大全及详解
wptr33 2025-01-09 16:34 22 浏览
1、FROM
FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境,实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在 docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件,如果找不到指定的镜像文件,docker build会返回一个错误信息。
FROM <repository>:<tag>
<repository>:指定作为base image的名称。
<tag>:base image的标签,为可选项,省略时默认为latest。
2、LABLE
LABEL用于为镜像添加元数据,元数以键值对的形式指定。
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
指定后可以通过docker inspect查看镜像的元数据信息。
docker inspect <REPOSITORY>:<TAG>或者<镜像ID>
3、COPY
用于从 Docker主机复制文件至创建的新映像文件。
COPY <src> ... <dest> 或 . COPY ["<src>",... "<dest>"]
<src>:要复制的源文件或目录,支持使用通配符
<dest>:目标路径,即正在创建的 image的文件系统路径;建议为使用绝对路径,<dest>绝对路径为镜像中的路径,而不是宿主机的路径。否则,COPY指定则以WORKDIR为其起始路径。
4、ADD
ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径。
ADD <src> ... <dest> 或 ADD ["<src>",... "<dest>"]
同COPY
5、WORKDIR
workdir为工作目录,指当前容器环境的工作目录,用于为 Dockerfile中所有的 RUN、CMD、ENTRYPOINT、COPY和 ADD指定设定工作目录。
WORKDIR <dirpath>
6、VOLUME
定义卷,只能是docker管理的卷,VOLUME为容器上的目录,用于在 image中创建一个挂载点目录,以挂载 Docker host上的卷或其它容器上的卷。
VOLUME <mountpoint> 或 VOLUME ["<mountpoint>"]
如果挂载点目录路径下此前在文件存在, docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。
7、EXPOSE
暴露指定端口,用于为容器打开指定要监听的端口以实现与外部通信
EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]
<protocol>:用于指定传输层协议,可为 tcp或udp二者之一,默认为 TCP协议。
8、ENV
ENV用于为镜像定义所需的环境变量,并可被 Dockerfile文件中位于其后的其它指令(如 ENV、ADD、COPY等)所调用 ,即先定义后调用,调用格式为 $variable_name或${variable_name}。
ENV <key> <value>或 . ENV <key>=<value> ...
第一种格式,<key>之后的所有内容均会被视作其 <value>的组成部分,因此一次只能设置一个变量。
第二种格式,可用一次设置多个变量,每个变量为一个“<key>=<value>”的键值对,如果<value>包含空格,可以以反斜线(\)进行转义,也可通过对<value>加引号进行标识;另外反斜线也可以用于续行。
定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。
9、RUN
RUN用于指定 docker build过程中运行的程序,其可以是任何命令,但是这里有个限定,一般为基础镜像可以运行的命令,如基础镜像为centos,安装软件命令为yum而不是ubuntu里的apt-get命令。
RUN和CMD都可以改变容器运行的命令程序,但是运行的时间节点有区别,RUN表示在docker build运行的命令,而CMD是将镜像启动为容器运行的命令。因为一个容器正常只用来运行一个程序,因此CMD一般只有一条命令,如果CMD配置多个,则只有最后一条命令生效。而RUN可以有多个。
RUN <command>或 . RUN ["<executable>", "<param1>", "<param2>"]
第一种格式中,<command>通常是一个shell命令,且以“/bin/sh -c”作为父进程来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使用 docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号。
第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的<paramN>为传递给命令的选项或参数;然而,此种格式指定的命令不会以“/bin/sh -c”来发起,表示这种命令在容器中直接运行,不会作为shell的子进程,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会进行,不过,如果要运行的没能力依赖此shell特性的话,可以将其替换为类似下面的格式。
10、CMD
类似于 RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同。RUN指令运行于映像文件构建过程中,而 CMD指令运行于基于 Dockerfile构建出的新映像文件启动一个容器时。 CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖。在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效。
CMD <command> 或 CMD ["<executable>","<param1>","<param2>"] 或 CMD["<param1>","<param2>"]
前两种语法格式的意义同 RUN。
第三种则用于为 ENTRYPOINT指令提供默认参数。
11、ENTRYPOINT
类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序。
与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT指定指定的程序。不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序。
ENTRYPOINT <command> 或 ENTRYPOINT ["<excutable>","<param1>","<param2>"]
docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用。Dockerfile文件中也可以存在多个 ENTRYPOINT指令,但仅有最后一个会生效。
12、ARG
ARG用于指定传递给构建运行时的变量。
ARG <name>[=<default value>]
在使用docker build 构建镜像时,可以通过--build-arg <varname>=<value>参数来指定或重设置这些变量的值。
13、STOPSIGNAL
STOPSIGNAL用于设置停止容器所要发送的系统调用信号。
STOPSIGNAL signal
所使用的信号必须是内核系统调用表中的合法的值,如:SIGKILL。
14、SHELL
SHELL用于设置执行命令(shell式)所使用的默认shell类型。
SHELL ["executable", "parameters"]
SHELL在Windows环境下比较有用,Windows下通常会有cmd和powershell两种shell,可能还会有sh。这时就可以通过SHELL 来指定所使用的shell类型。
15、USER
USER用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID,即改变容器中运行程序的身份。
默认情况下,container的运行身份为root用户。
USER <UID>|<UserName>
<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效UID,否则docker run命令将运行失败,使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。以下都是合法的指定试:
- USER user
- USER user:group
- USER uid
- USER uid:gid
- USER user:gid
- USER uid:group
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run 运行容器时,可以通过-u参数来覆盖所指定的用户。
16、ONBUILD
ONBUILD用于在Dockerfile中定义一个触发器,用来指定运行docker指令。
Dockerfile用于 build映像文件,此映像文件亦可作为base image被另一个 Dockerfile用作FROM指令的参数,并以之构建新的映像文件,
在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会 “触发 ”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器。
ONBUILD <INSTRUCTION>
尽管任何指令都可注册成为触发器指令,但是ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令。
使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild。
在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败。
ONBUILD在构建镜像时不会运行,是别人基于这个镜像作为基础镜像构建时,才会运行。
- 上一篇:你居然还在编写Dockerfile
- 下一篇:Dockerfile简单使用
相关推荐
- MySQL进阶五之自动读写分离mysql-proxy
-
自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
-
引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...
- 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
-
本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...
- 验证Mysql中联合索引的最左匹配原则
-
后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础...
- 你会看 MySQL 的执行计划(EXPLAIN)吗?
-
SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...
- MySQL 从入门到精通(四)之索引结构
-
索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...
- mysql总结——面试中最常问到的知识点
-
mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...
- mysql总结——面试中最常问到的知识点(2)
-
首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...
- MySQL基础全知全解!超详细无废话!轻松上手~
-
本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...
- 深入剖析 MySQL 中的锁机制原理_mysql 锁详解
-
在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...
- Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
-
引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...
- MySQL基础篇:DQL数据查询操作_mysql 查
-
一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...
- MySql:索引的基本使用_mysql索引的使用和原理
-
一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
如何将AI助手接入微信(打开ai手机助手)
-
redission YYDS spring boot redission 使用
-
SparkSQL——DataFrame的创建与使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)