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 会创建空目录而不是文件,可能导致意料之外的行为。
合理使用文件挂载机制,可以让你的容器化应用更加灵活、可控。