因此,我有一个使用 Next.js + SQLite + Litestream(Cloudflare R2 上的数据库备份)+ Docker 的项目,我尝试对/data
容器(./data/
磁盘上)上的文件夹执行数据库删除,以查看数据库是否正常恢复。
数据确实恢复正常。
rm -rf data/
但我很好奇当我在命令行中使用删除数据库时。
它不会在我的应用程序中引发任何错误并且它会继续工作。
即使我删除了该data/
文件夹,,,,Add One
仍Get All
继续Delete All
工作。data/
我不知道存储在哪里。
Fwiw,我在 Docker Compose 中使用匿名卷绑定挂载。
docker-compose.yml
version: '3.8'
services:
web:
image: easypanel-nextjs:0.0.1
build:
context: .
dockerfile: Dockerfile
container_name: nextjs-sqlite
env_file:
- .env.production
ports:
- 3000:3000
volumes:
- ./data:/data
现在发生的情况是,数据仅在我使用 & 停止服务器之前有效,docker-compose down
然后当我再次重新启动时,它会返回到之前的状态(在我执行之前rm -rf data
)
简而言之,
- 我愿意
docker-compose up
- 添加、获取、删除工作正常。比方说
data = { name: 'abby' }
- Litestream 在每次插入或删除时都会进行备份
data/
。 - 我删除
data/
文件夹。 - 即使
data/
包含 my 的文件夹*.sqlite
不存在,我仍然可以成功访问我的网络应用程序。它应该在这里崩溃,但没有。 - 我仍然可以添加、获取、删除。假设我愿意
data = { name: 'abby', name: 'nia' }
- 现在,当我停止使用
docker-compose down
并再次使用 运行它时docker-compose up
,我只能得到data = { name = 'abby' }
.nia
被删除是因为我data/
在添加之前删除了文件夹nia
。
这是怎么回事?是否使用匿名卷?无论我如何尝试,我都无法进入匿名文件夹。我也不知道如何*.sqlite
在匿名文件夹中下载,如果我以某种方式访问它,以便我可以查看其内容。
这种行为正常吗?我很想解决它。就像如果数据库不存在一样,它应该会崩溃。
完整的复制可以在https://github.com/deadcoder0904/easypanel-nextjs-sqlite/找到
引用unlink(2) 手册页
正如亚历克斯在评论中所说,它不会删除该文件。
它只是删除对它的引用。就像C中的指针一样。
因此该文件仍然有效并且所有数据库操作仍然有效。
一旦文件被关闭,它实际上就被删除了。
如果您在 Docker 中使用 Windows(主机)和 Linux(容器),这会非常令人困惑。
因为在Windows中可以看到,该
./data
目录被删除了。/data
如果您使用进行检查,它也会在 Linux 中被删除ls /data
。我这样做了并发现了这个:
但我想它并没有被真正删除。也许这就是Linux 的工作原理。也许Windows也是如此。