docker--Dockerfile操作指令

2023-05-16

docker–Dockerfile操作指令

文章目录

  • docker--Dockerfile操作指令
    • 一、FROM指令
      • 1、基本概述
      • 2、用法
      • 3、说明
      • 4、关于FROM scratch
    • 二、RUN指令
      • 1、基本概述
      • 2、用法
      • 3、说明
    • 三、ENV指令
      • 1、基本概述
      • 2、用法
            • 格式1:
            • 格式2:
    • 四、COPY指令
      • 1、基本概述
      • 2、用法
      • 3、说明
    • 五、ADD指令
      • 1、基本概述
      • 2、用法
      • 3、说明
    • 六、CMD指令
      • 1、基本概述
      • 2、用法
      • 3、说明
    • 七、ENTRYPOINT指令
      • 1、基本概述
      • 2、用法
      • 3、说明
    • 八、ARG指令
      • 1、基本概述
      • 2、用法
      • 3、说明
    • 九、VOLUME指令
      • 1、基本概述
      • 2、用法
    • 十、EXPOSE
      • 1、基本概述
      • 2、用法
      • 3、说明
    • 十一、WORKDIR指令
      • 1、基本概述
      • 2、用法
    • 总结
      • 1、ADD和copy区别
      • 2、CMD和entrypoint区别

序号指令含义
1FROM 镜像指定新镜像所基于的镜像,第 条指必须为from指令,每创建一个镜像就需要一条from指令
2MAINTAINER 名字说明新镜像的维护人信息
3RUN 命令在所基于的镜像上执行命令,并提交到新的镜像中;docker内每执行一条命令都是run开头
4CMD[“要运行的程序”,“参数1”,“参数2”]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行
5EXPOSE 端口号指定新镜像加载到Docker时要开启的端口
6ENV 环境变量 变量值设置一个环境变量的值,会被后面的run使用
7ADD 源文件、目录 目标文件/目录具体识别压缩格式并且自动解压,将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者一个URL
8COPY 源文件/目录 目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
9VOLUME [“目录”]在容器中创建一个挂载点
10USER 用户名/UID指定运行容器时的用户
11WORKDIR 路径为后续的RUN、CMD、ENTRYPOINT指定工作目录
12ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令
13HEALTHCHECK健康检查

一、FROM指令

1、基本概述

指定基础镜像,在基础镜像上进行定制
FROM就是指定基础镜像,此指令通常必需放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境

基础镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry 上拉取所需的镜像文件.如果找不到指定的镜像文件,docker build会返回一个错误信息

2、用法

FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
FROM scratch 		# 所有镜像的起源镜像,相当于Object类
FROM ubuntu
FROM ubuntu:bionic
FROM debian:buster-slim

3、说明

  • –platform 指定镜像的平台,比如: linux/amd64, linux/arm64, or windows/amd64
  • tag 和 digest是可选项,如果不指定,默认为latest

4、关于FROM scratch

scratch是祖宗镜像,所有的镜像都源于此创建,也是一个空镜像,一般要从零开始构建镜像时,用此方法

参考链接:

  • https://hub.docker.com/_/scratch?tab=description
  • https://docs.docker.com/develop/develop-images/baseimages/

该镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像

该镜像在构建基础镜像(如debian和busybox)或超最小镜像(仅包含一个二进制文件及其所需内容,如:hello-world)的上下文中最有用

二、RUN指令

1、基本概述

在构建镜像阶段需要执行FROM,指定镜像所支持的shell命令,一般各种基础镜像都支持普通shell命令

注意:

RUN可以写多个,每一个RUN指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多个shell命令通过“&&”符号连接一起成为在一条指令
每个RUN都是独立运行的,和前一个RUN无关

2、用法

#shell格式: 支持环境变量
RUN <命令>
 
#exec格式:
RUN ["可执行文件", "参数1", "参数2"]
 
#exec格式指定其他shell:
RUN ["/bin/bash","-c","echo hello wang"]
RUN echo "<h1>web 123</h1>" >/var/www/html/index.html
RUN ["/bin/bash","-c","echo 123456"]
RUN yum install -y epel-release \
  && yum install -y nginx \
  && echo "hj's web page" > /usr/share/nginx/html/index.html

3、说明

  • shell格式中,通常是一个shell命令,且以 "/bin/sh -c” 来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使用docker stop 命令停止容器时,此进程接收不到SIGTERM信号
  • exec格式中的参数是一个JSON格式的数组,其中为要运行的命令,后面的为传递给命令的选项或参数;然而,此种格式指定的命令不会以"/bin/sh -c"来发起,因此常见的shell操作如变量替换、通配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可替换为类似下面的格式

三、ENV指令

1、基本概述

以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过或KEY或{KEY}进行引用,并在容器运行时保持

2、用法

格式1:

此格式只能对一个key赋值,之后的所有内容均会被视作其的内容

ENV <key> <value>	
env a1 123
ENV a2 qwe
格式2:

此格式可以支持多个key赋值,定义多个变量建议使用,减少镜像层。还是 \ 位换行

ENV <key1>=<value1> <key2>=<value2> \
 <key3>=<value3> ...
ENV user=hj pswd=123 \
  xxx=123

四、COPY指令

1、基本概述

复制本地宿主机的到容器中

2、用法

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]	适用于路径有空白字符的情况
COPY test.txt /root/		本地文件到容器root目录

3、说明

  • 可以是多个,可以使用通配符,通配符规则满足Go语言的filepath.Match规则
  • 只能复制在Dockerfile文件同级目录下的文件,也就是以Dockerfile存放目录为根目录
  • 如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
  • 如果指定了多个,或在中使用了通配符,则dest必须是一个目录,且必须以 / 结尾
  • 可以是绝对路径或者是 WORKDIR 指定的相对路径
  • 使用COPY指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。也就是说可以加速构建速度,一般可用此优化镜像构建
  • 如果事先不存在,它将会被自动创建,这包括其父目录路径,即递归创建目录

五、ADD指令

1、基本概述

增强版的COPY,不仅支持COPY,还支持自动解缩。可以将复制指定的到容器中的

2、用法

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] 
ADD a.tgz /opt/ 		文件传到容器的/opt/目录后自动解压

3、说明

  • 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
  • 可以是绝对路径或者是 WORKDIR 指定的相对路径
  • 如果是目录,只复制目录中的内容,而非目录本身
  • 如果是一个 URL ,下载后的文件权限自动设置为 600
  • 如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以“\”结尾,则文件名URL指定的文件将被直接下载并保存为/
  • 如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于"tar -x"命令, 但是通过URL获取到的tar文件将不会自动展开
  • 如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径;如果不以/结尾,则其被视作一个普通文件,的内容将被直接写入到

六、CMD指令

1、基本概述

容器中需要持续运行的进程一般只有一个,CMD用来指定启动容器时默认执行的一个命令,且其运行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令

RUN是构建时运行的指令,CMD是容器运行时运行的指令

2、用法

#exec格式执行:推荐使用,且不支持环境变量
CMD ["命令","param1","param2"]
 
#sh格式执行:交互式使用,支持环境变量
CMD command param1 param2
 
#给entrypoint命令的传递参数:
CMD ["param1","param2"]
CMD ["nginx","-g","daemon off;"]
CMD ["curl","-s","https://ip.cn"]	同一文件中,只有此命令生效

3、说明

如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么开启容器时就会使用执行CMD指定的默认的命令

每个Dockerfile只能有一条CMD命令。如指定了多条,只有最后一条被执行
如果启动容器时用 docker run xxx cmd 指定运行的命令,则会覆盖 CMD 指定的命令

七、ENTRYPOINT指令

1、基本概述

类似CMD,配置容器启动后执行的命令及参数
如果与cmd命令共存,则cmd的内容当做参数传递给entrypoint

2、用法

#exc执行
ENTRYPOINT ["executable", "param1", "param2"]
 
#sh执行
ENTRYPOINT command param1 param2
#CMD的内容做参数传给ENTRYPOINT的命令
CMD ["-g","daemon off;"]
ENTRYPOINT ["nginx"]

3、说明

  • docker run -e/–env-file 不能覆盖ENTRYPOINT的参数,而是把传递的参数追加在ENTRYPOINT原有的参数后面
  • 如果docker run 后面没有额外参数,但是dockerfile中的CMD里有(即上面CMD的第三种用法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数
  • 如果docker run 后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run 后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数
  • 可以通过docker run --entrypoint string 参数在运行时替换,注意string不要加空格
  • 使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时无需重写命令就可以直接接受新参数
  • 每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效

八、ARG指令

1、基本概述

在build阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变量,只在构建时生效

2、用法

ARG <name>[=<default value>]
docker build --build-arg <参数名>=<>
vim xx/Dockerfile
ARG version=1.0
FROM base:${version}

3、说明

  • 如果变量名与ENV同名,则ENV覆盖ARG
  • 支持做最开始的变量定义,也就是写在FROM之前

九、VOLUME指令

1、基本概述

VOLUME实现的是匿名数据卷,无法指定宿主机路径和容器目录的挂载关系

通过docker rm -fv <容器ID> 可以删除容器的同时删除VOLUME指定的卷

宿主机目录为:

/var/lib/docker/volumes/<volume_id>/_data

指定容器内的挂载目录后,物理机自动在该路径下创建目录,卷id是随机生成的,_data就是容器内挂载的目录名,卷id以后就是挂载点根目录

当容器删除时,容器内在/data/下存的文件,还保留在物理机的/var/lib/docker/volumes/卷id/_data/

2、用法

VOLUME <容器内路径>
VOLUME ["<容器内路径1>", "<容器内路径2>"...]
docker rm -v 容器 		删除容器时,删除对应的匿名卷
VOLUME ["/data","/data2"]

十、EXPOSE

1、基本概述

EXPOSE仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射
启动容器是还是需要-p/-P来指明与物理机映射的端口才能真正分配端口

注意:

  • 即使 Dockerfile没有EXPOSE 端口指令,也可以通过docker run -p 临时暴露容器内程序真正监听的端口,所以EXPOSE 相当于指定默认的暴露端口,可以通过docker run -P 进行真正暴露

2、用法

EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ..]
EXPOSE 80 443/tcp
EXPOSE 3306 

3、说明

  • 可为tcp或udp二者之一,默认为TCP协议

十一、WORKDIR指令

1、基本概述

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录
如果目录不存在,会自动创建

2、用法

WORKDIR /path/to/workdir
WORKDIR /web
RUN echo 123456 > ts.txt
WORKDIR /a
WORKDIR b		切换多级目录,/a/b 

总结

1、ADD和copy区别

1、Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的
2、copy只能用于复制(节省资源)
3、ADD复制的同时,如果复制的对象时压缩包,ADD还可以解压(消耗资源)
4、COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中
5、满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩

2、CMD和entrypoint区别

一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker--Dockerfile操作指令 的相关文章

随机推荐

  • Hadoop伪分布搭建完整步骤

    1 新建虚拟机配置网络并测试网络连接 1 鼠标单击左侧虚拟机名称 xff0c 接着单击菜单栏 编辑 xff0c 在下拉菜单中选择 虚拟网络适配器 xff0c 如图 1 2 20 所示 4 在打开的 虚拟网络编辑器 对话框 xff0c 单击
  • linux--top命令查看系统所有详情

    Linux系统可以通过top 命令查看系统的CPU 内存 运行时间 交换分区 执行的线程等信息 通过top命令可以有效的发现系统的缺陷出在哪里 是内存不够 CPU处理能力不够 IO读写过高 一 top命令的第一行 top 19 56 47
  • OPENMV巡线

    将openmv图片划分成三个ROI区域 import sensor image time lcd from pyb import UART from pyb import LED ROIS 61 0 0 160 40 0 6 0 40 16
  • C++学习笔记

    一 一些重要的常见知识点 1 函数的分文件编写 xff1a h的头文件 xff08 写函数声明 xff09 cpp的源文件 xff08 写函数功能实现 xff09 2 空指针和野指针 xff1a 0 255的内存是系统所占有的 96 int
  • 使用XTDrone遇到的问题的解决

    在使用XTDrone时 xff0c 遇到了px4包找不到的问题 xff1a RLException mavros posix sitl launch is neither a launch file in package 使用官方配置文档h
  • 树莓派书籍全方位推荐

    相关书籍 python编程篇1 Python硬件开发树莓派从入门到实践 内容简介作者简介 2 Python树莓派开发从入门到精通内容简介编辑推荐 3 树莓派Python编程入门与实战书籍简介 4 树莓派Python编程指南内容简介作者简介
  • 总结几个比较常用的数学公式(新手入门)

    合理的公式可以帮助我们优化代码 xff0c 比如可以减少遍历的次数 xff0c 减少思考的难度 xff0c 提高算法效率 xff0c 此文章将持续更新 一 换底公式 Logab 61 logxb logxa 换底公式虽然不常用 xff0c
  • 【Linux/C/C++】面试题总结

    1 static关键字的作用 答 xff1a 在C语言中 xff0c 局部变量不会在诞生时被编译器自动初始化 xff0c 且生命周期终止于该变量所在的函数结束时 通过使用static关键字修饰局部变量 xff0c 可以使编译器自动为其赋初始
  • 匿名上位机V7与stm32通信协议

    一 xff0c 通信介绍 1 通信帧格式介绍 为了适应多种数据类型的传输 xff0c 保证高效的通信效率 xff0c 所有数据的通信 xff0c 均需要遵守本通信帧格式 本格式在 确保通信高效 源码简单 可移植性高的基础上 xff0c 实现
  • 酒店管理系统( JAVA)

    最近在学JAVA的数组学完之后做了一个简易的酒店管理系统 xff0c 酒店管理系统应该包含三部分 xff0c 第一部分是我们酒店管理系统的主题 xff0c 第二部分是我们酒店里的信息 xff0c 第三部分则是我们的房间信息 xff0c 具体
  • Ubuntu20.04下使用Qt5.15.2编译qgc源码

    下载QGC源码 可以在QGC官网按照教程根据自己的需求来下载源码QGC git clone recursive j8 https github com mavlink qgroundcontrol git git submodule upd
  • #ROS通讯机制:参数服务器

    参数服务器修改小海龟背景色 1 进入工作空间的src目录新建工作包 lzw08 64 ubuntu span class token operator span span class token operator span cd ros w
  • 9.19 GoogLeNet

    GoogLeNet GoogLeNet在2014年ImageNet图像识别挑战赛中大放异彩虽然NiN现在基本上没有被使用了 xff0c 但是GoogLeNet现在还是大量地被使用GoogLeNet是第一次做到快100层卷积层 xff08 第
  • react路由参数传递

    react路由的三种传参方式 1 向路由组件传递params参数 参数传递 在注册路由时接收参数 注意这里后面时冒号在前面的 在要展示的组件内接收params参数 2 第二种 xff0c 利用search传递参数 向路由组件传递参数 这种方
  • 链队列(详解)--->数据结构、C++实现

    问题引入 在数据结构中 xff0c 队列也是一种重要的线性结构 xff0c 常和栈放在一起进行学习 队列分为多种类型 xff0c 常见的如循环队列 链队列等 xff0c 如果此时此刻你对 链队列 感到困惑 xff0c 那就继续看下去 xff
  • Windows11正版下载和Windows10正版下载安装教程

    Windows11正版下载和Windows10正版下载 下载链接 xff1a https www microsoft com zh cn software download windows11 Windows11下载官网连接 https w
  • 2022-03-30 VsCode中使用clangd插件的各种设置

    最近尝试clang编译c 43 43 xff0c 所以用了clangd插件代替mscpp插件 xff0c 其中有不少问题 xff0c 都是通过各种搜索 xff0c 各种猜 xff0c 才能完善 xff0c 记录一下 xff0c 以便广大同仁
  • [Ubuntu]安装ifconfig

    apt install net tools
  • python3对接微信小程序蓝牙

    39 39 39 Created on 2019年10月15日 64 author lg 39 39 39 from Crypto Cipher import AES from binascii import b2a hex a2b hex
  • docker--Dockerfile操作指令

    docker Dockerfile操作指令 文章目录 docker Dockerfile操作指令一 FROM指令1 基本概述2 用法3 说明4 关于FROM scratch 二 RUN指令1 基本概述2 用法3 说明 三 ENV指令1 基本