Docker进阶之Dockerfile

2023-05-16

Dockerfile是一个文本格式的配置文件,我们可以使用Dockerfile来快速创建自定义的镜像。Dockerfile内部包含了一条条的指令,每一条指令构建一层,因此每一条指令应当描述该层如何构建。层越多,效率越低,因此,创建镜像,层越少越好
Dockerfile结构大致分为四个部分:

  1. 基础镜像信息
  2. 维护者信息
  3. 构建镜像的指令信息
  4. 容器启动时执行指令信息

1.Dockerfile常用指令

Dockerfile指令通常是以大写形式书写

1.1 FROM

使用Dockerfile定制镜像,那么一定需要以一个镜像为基础,在其上进行定制,因此我们需要指定一个基础镜像,FROM指令就是指定基础镜像,并且该指令必须是Dockerfile的第一条指令。

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

FROM ubuntu:latest AS my-ubuntu

FROM可以在Dockerfile中出现多次,以创建多个镜像,或者将一个构建阶段用作是另一个构建阶段的依赖项。AS <name>指定的名称可以在后续构建阶段使用,例如COPY --from=<name>。在默认情况下,--platform使用的当前构建请求的平台。

1.2 RUN

RUN <command> command为shell命令
RUN ["executable", "param1", "param2"] executable为可执行程序,param1,param2分别为参数

RUN apt-get update
RUN ["apt-get","update"]

RUN指令会在当前镜像创建一个新层,并且将执行结果提交.

1.3 CMD

CMD ["executable","param1","param2"] (首选形式)
CMD ["param1","param2"] (作为ENTRYPOINT的默认参数)
CMD command param1 param2 (shell命令形式)

Dockerfile中,只能有一条CMD指令,如果出现多个CMD命令,则只有最后一个命令会生效。我们使用CMD指令指定容器运行时要执行的命令以及提供默认参数。如果我们指定Docker运行时的参数,CMD指令中默认参数可以被覆盖。

注意CMD指令在镜像构建时不会执行任何操作。

1.4 LABEL

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

LABEL指令可以为镜像添加元数据。我们可以使用LABEL指令来添加镜像的作者信息等

1.5 EXPOSE

EXPOSE <port> [<port>/<protocol>...]

EXPOSE 8080
EXPOSE 8080/TCP

EXPOSE指令通知Docker容器在运行时监听指定的网络端口,可以指定端口的协议(TCP/UDP),如果不指定默认为TCP协议

1.6 ENV

ENV <key>=<value> ...

ENV version=1.0 name=test

ENV指令可以设置环境变量,设置的环境变量可以在后续的构建阶段中使用

1.7 ADD

ADD [--chown=<user>:<group>] <src>... <dest>

ADD test.txt /mydir/
ADD test/ /mydir/

ADD指令可以从<src>将文件、文件夹、远程文件地址复制并添加到镜像文件系统的指定位置<dest>

  • 如果<src>是一个文件,则该文件必须是在构建上下文中,因为docker构建的第一步就是讲上下文目录以及子目录发送到docker守护进程中,docker默认会在上下文目录的根目录去找Dockerfile文件。如果是一个可识别的压缩文件,复制之后将会被自动解压
  • 如果<src>是一个url且末尾不带/,则会将文件下载并复制到<dest>路径下。
  • 如果<src>是一个url且末尾带/,则会推断文件名并将文件下载并复制到<dest>/<filename>路径下。
  • 如果<src>是一个文件夹,该目录下所有的文件将会被复制(不包括文件夹
  • <dest>可以是相对路径、绝对路径,如果不存在,将会默认创建
  • 如果<dest>末尾不带/,其将会被视为一个常规文件,<src>的内容将会被复制并写入<dest>。例如:COPY a.txt b.txt

1.8 COPY

COPY [--chown=<user>:<group>] <src>... <dest>

# 复制文件到镜像中相对路径
COPY test.txt relativeDir/
# 复制文件到镜像中绝对路径
COPY test.txt /absoluteDir/

注意:COPY指令可以使用--from<name>参数,该参数将使用上一构建阶段,例如FROM ubuntu:latest AS my-ubuntu

  • 如果<src>是一个文件,则该文件必须是在构建上下文中,因为docker构建的第一步就是讲上下文目录以及子目录发送到docker daemon中,docker默认会在上下文目录的根目录去找Dockerfile文件。
  • <dest>可以是相对路径、绝对路径,如果不存在,将会默认创建。
  • 如果<dest>末尾不带/,其将会被视为一个常规文件,<src>的内容将会被复制并写入<dest>。例如:COPY a.txt b.txt

1.9 ENTRYPOINT

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

ENTRYPOINT command param1 param2

Docker运行时,可以使用--entrypoint来覆盖ENTRYPOINT指令。Dockerfile中如果出现多个ENTRYPOINT指令,则只有最后一个生效。如果不使用--entrypoint参数,Docker运行时,由ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而是将这些参数传递给由ENTRYPOINT启动的程序。

1.10 VOLUME

VOLUME ["/data"]

Docker运行会在宿主机生成数据卷并挂载VOLUME指令指定的位置。

1.11 WORKDIR

WORKDIR /path/to/workdir

WORKDIR指令为任意的RUN、CMD、ENTRYPOINT、ADD、COPY指令设置工作目录。如果指定的目录不存在,将会被默认创建。

  • WORKDIR指令在Dockerfile中可以多次使用,如果使用了相对路径,则后续路径会上一条的路径相对,例如:

    WORKDIR /aa
    WORKDIR bb
    WORKDIR cc
    RUN pwd
    
    # pwd命令的输出路径将为/aa/bb/cc
    
  • WORKDIR指令,可以使用Dockerfile中显示设置的环境变量

    ENV DIRPATH=/path
    WORKDIR $DIRPATH/$DIRPATH2
    RUN pwd
    
    #pwd输出的路径为/path/$DIRPATH2,因为$DIRPATH2无法被识别
    

1.12 ARG

ARG <name>[=<default value>]

ARG指令定义了一个变量,构建镜像时,可以使用--build-arg <varname>=<value>将该变量传递给构建器。

2.使用Dockerfile构建项目镜像

上下文目录:发出docker build指令所在目录就是上下文目录。默认情况下,docker会在当前目录中寻找Dockerfile文件,我们也可以使用-f参数来指定Dockerfile的位置。无论Dockerfile处于什么位置,上下文目录以及子目录的所有内容都会被发送到Docker daemon中。

  1. 我们创建一个SpringBoot应用

  2. 在pom.xml中配置Spring Boot Maven Plugin插件,并开启分层

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layers>
                        <enabled>true</enabled>
                    </layers>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  3. 使用分层特性创建优化的Docker Image

  4. 使用配置好的Dockerfile进行构建,假设Dockerfile在当前文件夹下,使用docker build .进行构建。

Dockerfile如下:

# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:11-jre as builder
# 执行命令的工作目录
WORKDIR apps
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract

# 正式构建镜像
FROM openjdk:11-jre
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
WORKDIR apps
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder apps/dependencies/ ./
COPY --from=builder apps/spring-boot-loader/ ./
COPY --from=builder apps/snapshot-dependencies/ ./
COPY --from=builder apps/application/ ./
ENTRYPOINT java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher

参考链接:https://docs.spring.io/spring-boot/docs/current/reference/html/container-images.html#container-images

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker进阶之Dockerfile 的相关文章

随机推荐

  • 一阶低通滤波器-连续转离散

    一阶低通滤波器 1 一阶连续低通滤波器 y s r
  • 汽车动力学模型

    1 动力学模型 在纵向时 xff0c 可能还会受到纵向空气阻力 xff0c 前轮滚动阻力 xff0c 后轮滚动阻力 xff0c 坡道重力分量等
  • PX4飞控源码及解析

    源码地址 xff1a https github com 987419640 Firmware 解析 xff1a https dev px4 io zh concept architecture html
  • Hadoop:简介和安装

    Hadoop简介 Hadoop项目由多个子项目组成 与其他项目不同 xff0c 这个项目更像一个生态系统 其中 xff0c 核心项目包括HDFS MapReduce框架 YARN和ZooKeeper HDFS是一个符合Hadoop要求的分布
  • centos6.x如何安装docker

    1 curl Lks https yum spaceduck org kernel ml aufs kernel ml aufs repo gt etc yum repos d kernel ml aufs repo 2 yum remov
  • c#开发Windows桌面程序,支持触摸屏

    这是一段由new bing聊天机器人提供的代码 xff0c 我没有测试是否能正常运行 xff0c 请谨慎使用 我是这样提问的 xff1a 我想用c 开发一款Windows桌面程序 xff0c 这个程序支持触摸屏 xff0c 这个程序打开后要
  • 七. (《Java核心技术》读书笔记+重点整理系列)异常处理、断言和日志

    目录 异常分类抛出异常捕获异常断言记录日志调试技巧PS 异常分类
  • IAR for ARM 无法烧写

    一直用的IDE都是Keil xff0c 最近需要用到的一款芯片只有IAR这一种环境可以从Demo里直接用 xff0c 所以用到了IAR xff0c 但发现自己装好了IAR xff08 版本8 32 1 xff09 并破解后 xff0c 编绎
  • ADC采集的数据通过串口进行发送 (2)

    1 xff09 在RIDE板子上调通的基础上 xff0c 硬件替代成CJ 575板 在后面步骤中并开始将代码中的硬件配置部分给对应成CJ 575板子的ARM9芯片的配置 2 xff09 将ADC CHANNEL和ADC CHANNEL MO
  • 相机成像模型、内参矩阵、外参矩阵

    相机针孔成像模型 基本的小孔成像过程 xff1a X坐标系是针孔所在坐标系 xff0c Y坐标系为成像平面坐标系 xff0c P为空间一点 xff0c 小孔成像使得P点在图像平面上呈现了一个倒立的像 xff0c 俯视图如下 xff1a 由三
  • YUM安装nginx

    想在 Alibaba Cloud Linux 3 2104 64位 CentOS 系统上安装 Nginx xff0c 你得先去添加一个资源库 xff0c 像这样 xff1a vim etc yum repos d nginx repo 使用
  • PX4固件在Gazebo下进行SITL仿真自己的包时遇到MODE: Unsupported FCU问题

    在运行别人的的px4代码时 xff0c 比如一个包Base control中 xff0c 终端提示了MODE Unsupported FCU xff0c 该错误主要是因为端口不正确 xff0c mavros没能正确的连接到px4固件 xff
  • 学习OpenCV在SFM系统的使用

    文章目录 OpenCV构建SFM模型SFM的概念从一对图像估计相机运动使用丰富特征描述符的点匹配利用光流进行点匹配寻找相机矩阵场景重建从多个场景重建重构的细化使用PCL可视化3D点云使用实例代码 本文是翻译自经典书籍Mastering OP
  • ROS无人机自主飞行(数传与串口)与PX4配置问题

    ROS无人机自主飞行与PX4配置问题 文中引用均为参考 xff0c 部分内容转载 xff01 特感谢提供了参考 xff01 PX4的配置 首先需要对PX4烧写固件 xff0c 版本问题上其实没有很多区别 xff0c 目前我所用的最新版本 1
  • js 如何删除对象整的key值

    采用delete进行删除 js 的delete可以根据key删除对象中的元素 var obj 61 定义一个对象 obj a 61 1 obj b 61 2 delete obj 39 a 39 打印obj b 2 delete a b 打
  • MSCKF-VIO源码框架及C++知识点总结

    MSCKF VIO源码框架及C 43 43 知识点总结 摘要MSCKF VIO程序架构前端前端流程图函数功能解读前端各主要函数模块耗时分析 后端后端流程图函数功能解读后端各主要函数模块耗时分析 运行过程分析 ROS里的信息流图C 43 43
  • 基于CNN(LeNet)的垃圾分类(C语言实现)

    基于CNN xff08 LeNet xff09 的垃圾分类 xff08 C语言实现CNN算子 xff09 一 先使用python训练模型二 提取参数提取模型参数提取图片 三 编写CNN算子在windows中实现在FPGA中实现 xff0c
  • Zigzag (最长交替子序列)

    Zigzag xff08 最长交替子序列 xff09 Your Ph D thesis on properties of integer sequences is coming along nicely Each chapter is on
  • educoder Git入门之本地版本库

    第1关 xff1a 本地版本库创建 创建gitTraining文件夹 mkdir gitTraining 进入gitTraining文件夹 cd gitTraining 请添加初始化本地Git仓库的命令 Begin git init End
  • Docker进阶之Dockerfile

    Dockerfile是一个文本格式的配置文件 xff0c 我们可以使用Dockerfile来快速创建自定义的镜像 Dockerfile内部包含了一条条的指令 xff0c 每一条指令构建一层 xff0c 因此每一条指令应当描述该层如何构建 层