Docker学习笔记 —— Dockerfile

本文详细介绍了Dockerfile的各个指令,包括`FROM`、`LABEL`、`RUN`、`CMD`、`ENTRYPOINT`、`ARG`、`ENV`、`ADD`、`COPY`、`WORKDIR`、`VOLUME`、`USER`、`EXPOSE`,并探讨了多阶段构建用于瘦身镜像的方法。通过理解这些指令,可以更好地编写和优化Dockerfile。
摘要由CSDN通过智能技术生成

系列文章目录

Docker学习笔记 —— Docker 介绍
Docker学习笔记 —— Docker 安装
Docker学习笔记 —— Docker 常用命令
Docker学习笔记 —— Docker 存储
Docker学习笔记 —— Docker 网络
Docker学习笔记 —— Dockerfile



  • Docker 可以通过读取Docker文件中的说明自动生成镜像。
  • Docker 是一个文本文档,其中包含用户可以在命令行上调用以组装镜像的所有命令,用户可以使用docker build创建一个连续执行多个命令行执行的自动构建;

一、 docker build

  • docker build 命令从Dockerfile和上下文构建镜像,生成的上下文是可以指定为本地文件系统上的目录,还可以指定为Git存储库位置。构建上下文是递归处理的;

  • 构建是由Docker守护进程运行,而不是由CLI运行;

    • 构建过程要做的第一件事是(递归处理)将整个上下文发送到守护进程,大多数情况下,最该从一个空目录作为上下文开始,并将Dockerfile 保存在该目录中,不要使用根目录 / 作为 PATH 构建上下文,因为它会导致构建将硬盘驱动器的全部内容传输到Docker守护进程;
    • 传统上,Dockerfile位于上下文的根目录中,也可以通过在 docker build中使用-f 来指向文件系统中任何位置的Dockerfile,还可以通过 -t来制定存储库和tag

二、环境置换(Environment replacement)

  • 环境变量(用ENV语句声明)也可以在某些指令中用作由 Dockerfile 解释的变量;

  • 环境变量在Dockerfile中用$variable_name 或 ${variable_name} 表示,大括号的语法通常用于解决变量名没有空格的问题如${variable}_name;

  • ${variable_name}还支持一下标准Bash修饰符:

    • ${variable:-word},表示如果设置了变量,则结果将是该值,如果未设置,则结果将为 word
    • ${variable:+word},表示如果设置了变量,则机构将是该值,如果未设置,则结果将是空字符串

三、 dockerfile 指令介绍

3.1 FROM

  • 格式:

    • FROM [--platform=<platform>] <image> [AS <name>]
    • FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
    • FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
  • FROM 指令初始化一个新的构建阶段并为后续指令设置基础镜像。因此,有效的Dockerfile 必须以FROM指令开头(ARG可以先于FROM),镜像可以是任何有效的镜像,最好挑一些apline,slim之类的基础小镜像,scratch镜像是一个空镜像,常用于多阶段构建;

  • FROM可以在单个Dockerfile中多次出现,以创建多个镜像或将一个构建阶段用作另一个构建阶段的依赖项。只需要在每条新FROM指令之前几下commit输出的最后一个镜像ID。每个FROM指令都会清除以前的指令创建的任何状态;

  • 可以通过添加 AS nameFROM指令来为新的构建阶段命名,这个名称可在后续FROMCOPY --from=<name> 说明中用于引用此阶段构建的镜像;

  • tag 和 digest 值是可选的,如果省略不写,默认使用 lastest ,如果找不到,将返回错误;

  • 如何确定我需要什么要的基础镜像?

    • Java应用当然是java基础镜像(SpringBoot应用)或者T omcat基础镜像(War应用)
    • JS模块化应用一般用nodejs基础镜像
    • 其他各种语言用自己的服务器或者基础环境镜像,如python、golang、java、php等
ARG version=3.13

#不可以引用多个
FROM alpine:$version

CMD ["/bin/sh","-c","echo 11111"]

在这里插入图片描述

3.2 LABEL

  • 格式:

    • LABEL <key>=<value> <key>=<value> <key>=<value> ...
  • 键值对结构,该指令向镜像添加元数据,标注镜像的一些说明信息,LABEL值中包含空格可以使用引号、\ 来处理;

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

3.3 MAINTAINER (已弃用)

  • 格式:

    • MAINTAINER <name>
  • MAINTAINER指令设置生成图像的作者字段,已弃用,用 LABEL 代替;

3.4 RUN

  • 格式:

    • RUN <command>

      • shell形式,命令在 shell 中运行,默认/bin/sh -c在 Linux 或cmd /S /CWindows 上;
      • shell形式,/bin/sh -c 的方式;
    • RUN ["executable", "param1", "param2"]

      • exec形式,不调用命令shell,不会进行shell处理

      • 例如:RUN[“echo”,"$HOME"]不会对变量 $HOME进行替换,如果想要shell处理,那么:

        • 使用shell形式;
        • 要么直接执行shell,例如 RUN["sh","-c","echo $HOME"];
  • RUN命令将在当前图层之上的新层中执行任何命令并提交结果,生成的提交镜像将用于 Dockerfile的下一步;

  • 分层运行 RUN 指令并生成提交符合Docker的核心概念,在Docker中,提交很便宜,可以源代码管理一样从镜像历史中的任何点创建容器;

  • exec形式可以避免破坏shell字符串,并使用不包含指定shell可执行文件的基本映像运行RUN命令。

  • 可以使用SHELL命令更改shell形式的默认shell。 在shell形式中,您可以使用\(反斜杠)将一条 RUN指令继续到下一行;

#指定构建参数【构建时】
ARG version=3.13

#不可以引用多个
FROM alpine:$version

#给镜
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
docker-compose 是一个用于定义和运行多个容器的工具,而 Dockerfile 是用于构建 Docker 镜像的文件。在使用 docker-compose 运行多个容器时,可以通过 Dockerfile 来定义每个容器所需的镜像。 以下是使用 docker-compose 结合 Dockerfile 的基本步骤: 1. 创建一个新的目录,并在该目录中创建一个名为 `docker-compose.yml` 的文件,用于定义容器组成和配置。 2. 在同一目录中,为每个容器创建一个文件夹,并在每个文件夹中创建一个 Dockerfile,用于构建该容器的镜像。可以根据需要,在 Dockerfile 中指定所需的基础镜像、软件包安装、文件复制等操作。 3. 在 `docker-compose.yml` 文件中定义每个容器的配置。使用 `services` 关键字来定义每个服务,并指定该服务使用的镜像和其他配置项。可以参考下面的示例: ```yaml version: "3" services: web: build: ./web # 指定构建 web 服务的 Dockerfile 所在路径 ports: - "8000:8000" # 指定端口映射 volumes: - ./app:/app # 挂载本地目录到容器内部 db: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=secret - MYSQL_DATABASE=mydatabase ``` 在上述示例中,定义了两个服务:`web` 和 `db`。`web` 服务使用 `./web` 目录中的 Dockerfile 构建镜像,映射本地端口 8000 到容器内部的 8000 端口,并挂载 `./app` 目录到容器内部。 `db` 服务使用官方的 `mysql:latest` 镜像,并设置了环境变量。 4. 运行 `docker-compose up` 命令来启动容器。docker-compose 会根据 `docker-compose.yml` 文件中的配置构建并启动容器组。 使用 docker-compose 结合 Dockerfile 可以更方便地定义和管理多个相关的容器,提高开发和部署的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值