1. 概述

Docker 是现代应用部署中不可或缺的工具之一,它允许我们将应用及其依赖打包为一个容器,便于分发和运行。除了基础的容器化功能,Docker 还提供了多种方式来扩展容器功能,例如挂载外部文件。

本文将重点介绍如何在 Docker 容器中挂载单个文件,涵盖 CLI 和 Docker Compose 两种方式,并指出常见错误及解决方法。


2. Docker 中的数据持久化机制

Docker 默认为每个容器创建一个隔离的环境,容器内的文件系统是临时的,一旦容器被删除,数据也会随之丢失。为了防止数据丢失,Docker 提供了两种主要的数据持久化机制:

  • Volumes:由 Docker 管理的持久化存储,适合需要 Docker 自动管理的场景。
  • Bind mounts:直接将宿主机的文件或目录挂载到容器中,适合需要外部程序访问的场景。

本文关注的是 Bind mounts,也就是将宿主机上的单个文件挂载到容器中。


3. 使用 Docker CLI 挂载文件

Docker CLI 是最常用的与容器交互的方式。我们可以通过 docker run 命令配合参数来挂载文件。

3.1. --mount 参数

--mount 是一种更现代、更灵活的语法,支持多个键值对配置:

docker run -d -it \
   --mount type=bind,source="$(pwd)"/file.txt,target=/file.txt,readonly \
   alpine:latest

参数说明:

  • type: 挂载类型,此处为 bind
  • source: 宿主机上的文件路径,建议使用绝对路径。
  • target: 容器内挂载路径。
  • readonly: 设置为只读挂载(可选)。

验证文件是否挂载成功:

docker exec -it <container_id> cat /file.txt

输出:

Hi Baeldung!

常见错误

  • 路径非绝对路径:会报错:

    docker: Error response from daemon: invalid mount config for type "bind": invalid mount path: 'file.txt' mount path must be absolute.
    
  • 文件不存在:Docker 会在容器中创建一个空目录,而不是文件。

  • Windows 路径格式问题:路径需使用 / 分隔符,或使用 PowerShell 的 $(pwd) 自动转换。

3.2. -v--volume 参数

-v 是较早的挂载方式,语法更简洁:

docker run -d -it \
    -v "$(pwd)"/file.txt:/file.txt:ro \
    alpine:latest

参数说明:

  • 第一个路径是宿主机路径。
  • 第二个路径是容器内路径。
  • ro 表示只读(rw 为可读写)。

常见错误

  • 路径非绝对路径:若为容器路径,会报错;若为宿主机路径,Docker 会尝试创建一个命名卷(named volume),而不是挂载文件。
  • 文件不存在:同上,会创建空目录。

4. 使用 Docker Compose 挂载文件

Docker Compose 是管理多容器应用的利器,同样支持文件挂载功能。

4.1. 长语法(Long Syntax)

适用于需要详细配置的场景:

services:
  alpine:
    image: alpine:latest
    tty: true
    volumes:
      - type: bind
        source: ./file.txt
        target: /file.txt
        read_only: true

✅ 优点:

  • 支持相对路径(相对于 docker-compose.yml 文件)。
  • 更清晰的配置结构。

4.2. 短语法(Short Syntax)

适用于快速配置:

services:
  alpine:
    image: alpine:latest
    tty: true
    volumes:
      - ./file.txt:/file.txt:ro

✅ 优点:

  • 语法简洁,与 CLI 中的 -v 一致。
  • 支持相对路径。

⚠️ 注意:

  • 短语法无法配置某些高级选项(如 bind-propagation)。
  • 可以在同一个 volumes 数组中混合使用长、短语法。

5. 总结

本文介绍了如何在 Docker 容器中挂载单个文件,包括使用 Docker CLI 和 Docker Compose 的两种方式。

方式 语法 是否支持相对路径 是否支持高级配置
--mount 键值对
-v 冒号分隔
Docker Compose 长语法 YAML 键值
Docker Compose 短语法 冒号分隔

建议

  • 如果你需要更清晰、可维护的配置,推荐使用 --mount 或 Docker Compose 长语法。
  • 如果你只是临时快速测试,可以使用 -v 或 Docker Compose 短语法。

⚠️ 踩坑提醒

  • 挂载文件时务必使用绝对路径,否则可能挂载失败或挂载成目录。
  • Windows 用户注意路径格式,建议使用 PowerShell 的 $(pwd) 自动转换路径。
  • 文件不存在时,Docker 会创建空目录而不是文件,可能导致意料之外的行为。

合理使用文件挂载机制,可以让你的容器化应用更加灵活、可控。


原始标题:Mounting a Single File in a Volume Using Docker