Immich用非root账号运行的设置方法
前言
immich服务用docker部署,有一个非常刺挠不舒服的问题,就是文件权限。
docker需要root账户跑(虽然可以通过一些设置实现non-root账户跑),用docker部署的immich默认也就是root权限,导致通过immich上传和归档的照片、视频文件都是root权限。
这说不上什么大的问题,但我觉得很不舒服,就看了官方文档,要怎么设置才能用non-root账户跑。但官网含糊其辞,最后在虚拟机里反复部署、删除、调试,终于搞定了我的三个需求:
-
上传和归档的照片、视频,不能是root权限
-
immich图像算法处理以后生成的内容,不能是root权限
-
整体服务和功能要正常可用
这里不得不夸一下photoprism,在docker-compose配置文件里就定义好了用non-root账号运行的参数,取消注释就行了。
步骤
先看下官网给出的用非root账号运行immich的办法
How can I run Immich as a non-root user?
1. Set the PUID/PGID environment variables (in .env).
2. Set the corresponding user argument in docker-compose for each service.
3. Add an additional volume to immich-microservices that mounts internally to /usr/src/app/.reverse-geocoding-dump.
The non-root user/group needs read/write access to the volume mounts, including UPLOAD_LOCATION.
简单英翻中一下:
- 在
.env
文件中设置PUID/PGID
- 在
docker-compose
配置文件中给每一个服务(service)配置对应的user
参数 - 给
immich-microservices
服务添加一个额外的卷(volume)用来挂载容器内部的/usr/src/app/.reverse-geocoding-dump
目录 - 注意各个文件夹的读写权限分配
但实际看完这个官网的步骤也是一头雾水的,说的很模糊,也没有给出示例。
最后在immich项目的github主页的issues列表里,找到了别人贴出的non-root场景的配置信息,反复调试以后,确定了一下方案。
第一步:在
.env
中配置PUID/PGID
这里假定linux普通账户jack
的uid/gid是1000:1000。在.env
文件中添加以下内容。
## non-root user
PUID=1000
PGID=1000
## non-root user reverse-geocoding-dump directory
REVERSE_GEOCODING_DUMP=./geocoding
第二步:在
docker-compose.yml
中添加user
参数。
先看我们的两个需求。第一点:上传和归档的照片、视频,不能是root权限。
这需要改的是immich_server
,添加user
参数。
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
user: ${PUID}:${PGID}
第二点需求:immich图像算法处理以后生成的内容,不能是root权限。
这需要改的是immich_microservices
,添加user
和volumes
参数。
immich-microservices:
container_name: immich_microservices
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
user: ${PUID}:${PGID}
# extends:
# file: hwaccel.yml
# service: hwaccel
command: ["start.sh", "microservices"]
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
- ${REVERSE_GEOCODING_DUMP}:/usr/src/app/.reverse-geocoding-dump
第三步:手动创建
${UPLOAD_LOCATION}
和${REVERSE_GEOCODING_DUMP}
两个目录并分配权限。
手动创建这俩目录,是因为用root跑docker,部署immich时自动创建的目录也是root权限,会导致immich的俩non-root services运行出现权限错误。
好了,到这里就配置完了。不需要按照官网的要求,给每一个service都加上user参数。
常用命令
部署运行
docker-compose up -d
停止全部服务
docker-compose stop
清空全部服务(删掉容器&清空数据)
docker-compose down -v
查看指定服务的日志
docker logs [service]
更新版本
docker-compose pull && docker-compose up -d