如何用Dockerode实现主机与容器目录同步并保留重建后数据?
实现Dockerode主机与容器目录同步(数据持久化)
要实现主机和容器的目录同步,并且删除容器后仍能保留原有数据,你需要在容器配置中添加持久化挂载的相关设置。下面基于你的现有代码,提供两种常用的实现方案:
方案1:绑定挂载(Bind Mount)
直接将主机上的指定目录挂载到容器内的目标路径,主机和容器的读写操作会实时同步。这种方式适合需要直接访问主机文件系统的场景。
修改你的代码,在HostConfig中添加Binds配置:
// 替换为你主机上的绝对路径,比如 "/home/user/mcserver-data" const hostDataDir = "/path/to/your/host/directory"; // 替换为容器内需要挂载的目标路径,比如 "/data" const containerDataDir = "/path/to/container/directory"; let containerMeta = { Image: 'secret/image', AttachStdout: true, AttachStderr: true, Tty: true, ExposedPorts: { '19132/udp': {}, }, HostConfig: { PortBindings: { '19132/udp': [ { HostPort: SERVER_PORT, }, ], }, // 添加绑定挂载配置 Binds: [ `${hostDataDir}:${containerDataDir}` ] }, }; let container = await docker.createContainer(containerMeta);
说明:
Binds是一个数组,每个元素的格式为主机绝对路径:容器绝对路径,必须使用绝对路径,否则Docker会误判为卷。- 如果你需要设置只读挂载(容器只能读取主机目录内容,不能修改),可以在末尾加上
:ro,比如${hostDataDir}:${containerDataDir}:ro。 - 删除容器后,主机目录的所有数据都会保留,重新创建容器时挂载同一个主机路径即可恢复数据。
方案2:Docker卷(Volume)
这是Docker官方推荐的持久化方式,数据由Docker统一管理,存储在Docker的专属目录中(无需手动指定主机路径),更安全且跨环境兼容性更好。
方式A:提前创建命名卷
先创建一个命名卷,再挂载到容器:
// 创建一个名为 "mcserver-data" 的命名卷(可自定义名称) const volume = await docker.createVolume({ Name: 'mcserver-data' }); let containerMeta = { Image: 'secret/image', AttachStdout: true, AttachStderr: true, Tty: true, ExposedPorts: { '19132/udp': {}, }, HostConfig: { PortBindings: { '19132/udp': [ { HostPort: SERVER_PORT, }, ], }, // 使用Mounts配置挂载卷 Mounts: [ { Type: 'volume', Source: 'mcserver-data', // 刚才创建的卷名 Target: '/path/to/container/directory', // 容器内目标路径 // 可选:设置只读挂载 // ReadOnly: true } ] }, }; let container = await docker.createContainer(containerMeta);
方式B:自动创建卷
如果不想提前创建卷,也可以直接在Mounts中指定一个新的卷名,Docker会自动为你创建:
let containerMeta = { Image: 'secret/image', AttachStdout: true, AttachStderr: true, Tty: true, ExposedPorts: { '19132/udp': {}, }, HostConfig: { PortBindings: { '19132/udp': [ { HostPort: SERVER_PORT, }, ], }, Mounts: [ { Type: 'volume', Source: 'mcserver-data', // 新卷名,Docker会自动创建 Target: '/path/to/container/directory' } ] }, }; let container = await docker.createContainer(containerMeta);
说明:
- Docker卷独立于容器存在,即使删除容器,卷中的数据也会保留。重新创建容器时挂载同一个卷即可恢复数据。
- 可以通过Docker命令或Dockerode的API查看、管理卷,比如
docker volume ls查看所有卷。
注意事项
- 确保容器内的目标路径要么不存在,要么是空的,否则挂载后容器内原有内容会被挂载的主机目录/卷的内容覆盖(或者说,挂载后容器内的路径会被挂载源替代)。
- 如果你使用Windows主机,绑定挂载的路径格式需要调整,比如
C:\\path\\to\\dir:/container/path(注意转义反斜杠),或者使用WSL路径/mnt/c/path/to/dir:/container/path。
内容的提问来源于stack exchange,提问作者user7885981
相关产品推荐
相关产品推荐

