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系统管理中有简单介绍;

相关推荐
厨 神9 分钟前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku06614 分钟前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen0116 分钟前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦1 小时前
linux 解压缩
linux·运维·服务器
最新小梦2 小时前
Docker日志管理
运维·docker·容器
鸡鸭扣3 小时前
虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通
linux·运维·ubuntu
友友马3 小时前
『 Linux 』HTTP(一)
linux·运维·服务器·网络·c++·tcp/ip·http
千禧年@3 小时前
微服务以及注册中心
java·运维·微服务
ZHOU西口3 小时前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
lgbisha4 小时前
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
低代码·docker·华为云