justxuewei / cloudreve-docker

Source code of Docker image for Cloudreve V3
https://hub.docker.com/r/xavierniu/cloudreve
MIT License
220 stars 51 forks source link

优化掉在宿主上预创建 conf.ini/cloudreve.db 的步骤 #39

Closed shuosiw closed 3 years ago

shuosiw commented 3 years ago

有个想法,目前的方式需要启动前在宿主上手动创建 con.inicloudreve.db,而这两个文件都是空白文件,对于 cloudreve 的初始化没有任何作用,仅仅只是为了后续实现配置的持久化。

预创建Cloudreve的数据库和配置文件,这里以/dockercnf/cloudreve为cloudreve配置目录。

如果没进行预创建者两个文件,docker 会在宿主上生成两个同名的目录,并挂载到容器中:

/cloudreve/conf.ini/
/cloudreve/cloudreve.db/

最终容器启动时因为同名目录无法初始化生成配置文件及数据库文件,导致初始化失败:

[Panic] 2021-05-11 23:52:08 无法解析配置文件 '/cloudreve/conf.ini': BOM: read /cloudreve/conf.ini: is a directory
panic: 无法解析配置文件 '/cloudreve/conf.ini': BOM: read /cloudreve/conf.ini: is a directory

goroutine 1 [running]:
github.com/cloudreve/Cloudreve/v3/pkg/util.(*Logger).Panic(0xc000254010, 0x117b2a8, 0x21, 0xc0000bbac0, 0x2, 0x2)
/ProjectCloudreve/Cloudreve/pkg/util/logger.go:74 +0xe5
github.com/cloudreve/Cloudreve/v3/pkg/conf.Init(0x7ffcf2722efe, 0x13)
/ProjectCloudreve/Cloudreve/pkg/conf/conf.go:121 +0x1de
github.com/cloudreve/Cloudreve/v3/bootstrap.Init(0x7ffcf2722efe, 0x13)
/ProjectCloudreve/Cloudreve/bootstrap/init.go:18 +0x3e
main.init.0()
/ProjectCloudreve/Cloudreve/main.go:23 +0x205

有个初步的想法,是提供一个运行配置目录,比如 /cloudreve/config/,思路如下:

  1. 容器中 /cloudreve/config/ 会用来保存 con.inicloudreve.db 文件
  2. 将宿主的一个目录,比如 /path/to/cloudreve/ 映射到容器的 /cloudreve/config/,用来持久化配置及数据库
  3. entrypoint.sh 脚本修改增加进入 /cloudreve/config/ 目录后再启动 cloudreve:

    #!/bin/bash
    
    chmod +x /cloudreve/cloudreve-main
    cd /cloudreve/config && /cloudreve/cloudreve-main -c conf.ini

这样可以省去在宿主上手动创建文件的过程,直接启动 docker 即可:

docker run -d \
  --name cloudreve \
  -e PUID=1000 \ # optional
  -e PGID=1000 \ # optional
  -e TZ="Asia/Shanghai" \ # optional
  -p 5212:5212 \ 
  --restart=unless-stopped \
  -v <PATH TO UPLOADS>:/cloudreve/uploads \
  -v <PATH TO CONFIG>:/cloudreve/config \    # change
  -v <PATH TO avatar>:/cloudreve/avatar \
  xavierniu/cloudreve

宿主上 <PATH TO CONFIG> 不存在的话,也会自动创建,而如果还是需要指定配置文件及数据库文件,也可以再单独指定,只不过需要修改容器中的挂载路径,增加 config 这一级目录

@xavier-niu

justxuewei commented 3 years ago

感谢反馈,这个我先测试一下,如果没问题将在下个版本中更新。

shuosiw commented 3 years ago

感谢反馈,这个我先测试一下,如果没问题将在下个版本中更新。

@xavier-niu 我也是第一次用 cloudreve,看了 cloudreve 的文档中没有可以指定 db 文件路径的配置项,默认是在启动 cloudreve-main 命令时的目录查找或初始化 cloudreve.db:

为了保证 cloudreve.db 这个文件也能随着 conf.ini 一起持久化,所以才需要在 entrypoint.sh 脚本中先进入 /cloudreve/config 再启动主进程。如果你知道有什么运行参数可以指定的 db 文件,那也可以保证当前的运行目录,通过配置项指定,比如:

#!/bin/bash

chmod +x ./cloudreve-main
./cloudreve-main -c config/conf.ini -d config/cloudreve.db
justxuewei commented 3 years ago

目前已经更新,请等待GitHub Action结束后测试。

shuosiw commented 3 years ago

目前已经更新,请等待GitHub Action结束后测试。

@xavier-niu -d dbfile 这个参数是我举例的,不一定有这个参数..需要先确认一下

justxuewei commented 3 years ago

目前已经更新,请等待GitHub Action结束后测试。

@xavier-niu -d dbfile 这个参数是我举例的,不一定有这个参数..需要先确认一下

我发现这个问题了,已经修改。

shuosiw commented 3 years ago

目前已经更新,请等待GitHub Action结束后测试。

@xavier-niu -d dbfile 这个参数是我举例的,不一定有这个参数..需要先确认一下

我发现这个问题了,已经修改。

嗯嗯,确实没有这个参数的话,可以按照我第一条评论里面的做法吧,先 cd 到 config 目录,再启动,这样 conf.ini 就跟 db 文件都在一起,这样也只需要挂在一个目录:

#!/bin/bash

chmod +x /cloudreve/cloudreve-main
cd /cloudreve/config && /cloudreve/cloudreve-main -c conf.ini
justxuewei commented 3 years ago

目前已经更新,请等待GitHub Action结束后测试。

@xavier-niu -d dbfile 这个参数是我举例的,不一定有这个参数..需要先确认一下

我发现这个问题了,已经修改。

嗯嗯,确实没有这个参数的话,可以按照我第一条评论里面的做法吧,先 cd 到 config 目录,再启动,这样 conf.ini 就跟 db 文件都在一起,这样也只需要挂在一个目录:

#!/bin/bash

chmod +x /cloudreve/cloudreve-main
cd /cloudreve/config && /cloudreve/cloudreve-main -c conf.ini

只需要修改conf.ini文件就行,不过如果新版本更新后可能需要修改数据库

shuosiw commented 3 years ago

是的,如果从旧版本升级上来的话,需要调整 db 目录,不过对于新使用的,就非常方便了。直接 docker run 就可以了,不需要手动去创建 conf 跟 db 文件

shuosiw commented 3 years ago

另外我也有整理了一个 cloudreve 的 unraid 安装模版,在 unraid docker 上添加模版后,可以直接点点点就创建一个容器出来,目前就是使用你的镜像,后续更新我再调整目录映射配置:

https://github.com/shuosiw/unraid/blob/master/Cloudreve.xml

justxuewei commented 3 years ago

另外我也有整理了一个 cloudreve 的 unraid 安装模版,在 unraid docker 上添加模版后,可以直接点点点就创建一个容器出来,目前就是使用你的镜像,后续更新我再调整目录映射配置:

https://github.com/shuosiw/unraid/blob/master/Cloudreve.xml

感谢,不过我希望你可以提供一些基本的步骤,让更多人知道如何去使用。目前整体的README结构太混乱了,我有时间的时候会整理一下,到时候我会考虑以外链的形式连接到你的项目中去的。

justxuewei commented 3 years ago

目前已经在develop分支更新并完成测试,请等待GitHub Action结束后更新容器。