docker - DockerFile 编写 指令

文章目录

  • 前言
    • [docker - DockerFile 编写 指令](#docker - DockerFile 编写 指令)
      • [1. FROM](#1. FROM)
      • [2. MAINTAINER](#2. MAINTAINER)
      • [3. RUN](#3. RUN)
      • [4. CMD](#4. CMD)
      • [5. LABEL](#5. LABEL)
      • [6. EXPOSE](#6. EXPOSE)
      • [7. ENV](#7. ENV)
      • [8. ADD](#8. ADD)
      • [9. COPY](#9. COPY)
      • [10. ENTRYPOINT](#10. ENTRYPOINT)
      • [11. VOLUME](#11. VOLUME)
      • [12. USER](#12. USER)
      • [13. WORKDIR](#13. WORKDIR)
      • [14. ARG](#14. ARG)
      • [15. ONBUILD](#15. ONBUILD)
      • [16. STOPSIGNAL](#16. STOPSIGNAL)

前言

如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。

而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


docker - DockerFile 编写 指令

1. FROM

设置镜像使用的基础镜像
语法:FROM < image>[:< tag> | @< digest>]
提示:镜像都是从一个基础镜像(操作系统或其他镜像)生成,可以在一个Dockerfile中添加多条FROM指令,一次生成多个镜像
注意:如果忽略tag选项,会使用latest镜像

2. MAINTAINER

设置镜像的作者
语法:MAINTAINER

3. RUN

编译镜像时运行的脚本
语法:RUN < command>

RUN ["executable","param1","param2"]
提示:RUN指令会生成容器,在容器中执行脚本,容器使用当前镜像,脚本指令完成后,Docker Daemon会将该容器提交为一个中间镜像,供后面的指令使用
补充:RUN指令第一种方式为shell方式,使用/bin/sh -c < command>运行脚本,可以在其中使用\将脚本分为多行;RUN指令第二种方式为exec方式,镜像中没有/bin/sh或者要使用其他shell时使用该方式,其不会调用shell命令。
例子:

bash 复制代码
RUN source $HOME/.bashrc;
echo $HOME

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

RUN ["sh","-c","echo","$HOME"] 使用第二种方式调用shell读取环境变量

4. CMD

设置容器的启动命令
语法:

CMD ["executable","param1","param2"]

CMD ["param1","param2"]

CMD < command>
提示:CMD第一种、第三种方式和RUN类似,第二种方式为ENTRYPOINT参数方式,为entrypoint提供参数列表
注意:Dockerfile中只能有一条CMD命令,如果写了多条则最后一条生效

5. LABEL

设置镜像的标签

延伸:镜像标签可以通过docker inspect查看
格式:LABEL < key>=< value> < key>=< value> ...
提示:不同标签之间通过空格隔开
注意:每条指令都会生成一个镜像层,Docker中镜像最多只能有127层,如果超出Docker Daemon就会报错,如LABEL ...=... <假装这里有个换行> LABEL ...=...合在一起用空格分隔就可以减少镜像层数量,同样,可以使用连接符\将脚本分为多行,镜像会继承基础镜像中的标签,如果存在同名标签则会覆盖。

6. EXPOSE

设置镜像暴露的端口
语法:EXPOSE < port> < port> ...
延伸:镜像暴露端口可以通过docker inspect查看
提示:容器启动时,Docker Daemon会扫描镜像中暴露的端口,如果加入-P参数,Docker Daemon会把镜像中所有暴露端口导出,并为每个暴露端口分配一个随机的主机端口(暴露端口是容器监听端口,主机端口为外部访问容器的端口)
注意:EXPOSE只设置暴露端口并不导出端口,只有启动容器时使用-P/-p才导出端口,这个时候才能通过外部访问容器提供的服务

7. ENV

设置容器的环境变量
语法:ENV < key>=< value>...|< key> < value>
注意:环境变量在整个编译周期都有效,第一种方式可设置多个环境变量,第二种方式只设置一个环境变量
提示:

bash 复制代码
通过${变量名}或者 $变量名使用变量,使用方式${变量名}时
可以用${变量名:-default} ${变量名:+cover}设定默认值或者覆盖值

ENV设置的变量值在整个编译过程中总是保持不变的

8. ADD

编译镜像时复制文件到镜像中
语法:ADD < src>... < dest>|["< src>",... "< dest>"]
注意:当路径中有空格时,需要使用第二种方式

当src为文件或目录时,Docker Daemon会从编译目录寻找这些文件或目录,而dest为镜像中的绝对路径或者相对于WORKDIR的路径;
提示:src为目录时,复制目录中所有内容,包括文件系统的元数据,但不包括目录本身

src为压缩文件,并且压缩方式为gzip,bzip2或xz时,指令会将其解压为目录;

如果src为文件,则复制文件和元数据;

如果dest不存在,指令会自动创建dest和缺失的上级目录;

9. COPY

编译镜像时复制文件到镜像中
语法:COPY < src>... < dest>|["< src>",... "< dest>"]

提示:指令逻辑和ADD十分相似,同样Docker Daemon会从编译目录寻找文件或目录,dest为镜像中的绝对路径或者相对于WORKDIR的路径

10. ENTRYPOINT

设置容器的入口程序

语法:

ENTRYPOINT ["executable","param1","param2"]

ENTRYPOINT command param1 param2(shell方式)
提示:

入口程序是容器启动时执行的程序,docker run中最后的命令将作为参数传递给入口程序

入口程序有两种格式:exec、shell,其中shell使用/bin/sh -c运行入口程序,此时入口程序不能接收信号量当Dockerfile有多条ENTRYPOINT时只有最后的ENTRYPOINT指令生效;

如果使用脚本作为入口程序,需要保证脚本的最后一个程序能够接收信号量,可以在脚本最后使用exec或gosu启动传入脚本的命令;
注意:通过shell方式启动入口程序时,会忽略CMD指令和docker run中的参数

为了保证容器能够接受docker stop发送的信号量,需要通过exec启动程序;如果没有加入exec命令,则在启动容器时容器会出现两个进程,并且使用docker stop命令容器无法正常退出(无法接受SIGTERM信号),超时后docker stop发送SIGKILL,强制停止容器
例子:FROM ubuntu <换行> ENTRYPOINT exec top -b

11. VOLUME

设置容器的入口程序

语法:

VOLUME ["/data"]

VOLUME /data1 /data2

提示:启动容器时,Docker Daemon会新建挂载点,并用镜像中的数据初始化挂载点,可以将主机目录或数据卷容器挂载到这些挂载点;

12. USER

设置运行RUN CMD ENTRYPOINT的用户名
语法:USER < name>

13. WORKDIR

设置RUN CMD ENTRYPOINT COPY ADD 指令的工作目录
语法:WORKDIR < Path>
提示:如果工作目录不存在,则Docker Daemon会自动创建

Dockerfile中多个地方都可以调用WORKDIR,如果后面跟的是相对位置,则会跟在上条WORKDIR指定路径后(如WORKDIR /A WORKDIR B WORKDIR C,最终路径为/A/B/C)

14. ARG

设置编译镜像时加入的参数
语法:ARG < name>[=< defaultValue>]
注意:ARG从定义它的地方开始生效而不是调用的地方,在ARG之前调用编译变量总为空,在编译镜像时,可以通过docker build --build-arg < var>=< value>设置变量,如果var没有通过ARG定义则Daemon会报错;

可以使用ENV或ARG设置RUN使用的变量,如果同名则ENV定义的值会覆盖ARG定义的值,与ENV不同,ARG的变量值在编译过程中是可变的,会对比使用编译缓存造成影响(ARG值不同则编译过程也不同)
例子:A

RG CONT_IMAG_VER

RUN echo $CONT_IMG_VER

ARG CONT_IMAG_VER

RUN echo hello

当编译时给ARG变量赋值hello,则两个Dockerfile可以使用相同的中间镜像,如果不为hello,则不能使用同一个中间镜像;

15. ONBUILD

设置镜像的ONBUILD指令

语法:ONBUILD [INSTRUCTION]
提示:从该镜像生成子镜像,在子镜像的编译过程中,首先会执行父镜像中的ONBUILD指令,所有编译指令都可以成为钩子指令

16. STOPSIGNAL

设置容器的退出信号量
语法:STOPSIGNAL signal
提示:信号量可以是数字或者信号量的名字,如9或者SIGKILL,信号量的数字说明在Linux系统管理中有简单介绍;

相关推荐
黄毛火烧雪下4 小时前
【Ruby 】脚本和自动化语言 常用的内容
运维·自动化·ruby
小白不想白a5 小时前
【shell】每日shell练习:安全日志入侵检测/系统配置文件合规检查
运维·服务器
洛克大航海6 小时前
Linux 中新建用户
linux·运维·服务器
三口吃掉你6 小时前
Docker安装Elasticsearch、kibana、IK分词器
elasticsearch·docker·kibana·ik分词器
dehuisun6 小时前
jenkins流水线部署springboot项目
运维·jenkins
fly五行7 小时前
Windows 系统下使用 Docker 安装 Milvus 向量数据库
windows·docker·milvus
爱宇阳7 小时前
离线环境下运行 Docker 容器编排指南
docker·容器·eureka
蜜蜜不吃糖7 小时前
解决Vcenter告警datastore存储容量不足问题
linux·运维·服务器
东城绝神7 小时前
《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署redis 7.4.5容器版分片集群》
linux·运维·redis·架构·分片集群
Java陈序员8 小时前
免费开源!一款操作 MySQL 和 MariaDB 的 Web 界面工具!
mysql·docker·php·mariadb