安装 KICKPI RK3576

安装 KICKPI RK3576

RK3576 docker

https://gitee.com/tanzhtanzh/kickpi-book/tree/master/rk3576/zh 官方文档

https://zhuanlan.zhihu.com/p/24228872523 可以参考网上的解决方法 添加源试试

配件串口连接线:

image

  • 设置时区亚洲/上海
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime   

KICKPI Ubuntu 安装中文输入法(ibus 版)

1️⃣ 更新软件源

sudo apt update

2️⃣ 安装中文输入法相关软件

sudo apt install -y ibus ibus-pinyin ibus-libpinyin

3️⃣ 配置系统使用 ibus

im-config -n ibus

这个命令会将系统默认输入法框架设置为 ibus。

4️⃣ 重新登录桌面或重启系统

确保配置生效。

5️⃣ 添加中文输入法

  1. 打开 IBus Preferences(在桌面搜索或终端输入 ibus-setup 打开)。
  2. 进入 Input Method 标签页。
  3. 点击 Add → Chinese → Pinyin(或其他中文输入法,如双拼、五笔)。
  4. 应用保存设置。

6️⃣ 切换输入法

  • 默认快捷键:Ctrl + Space
  • 可在 IBus Preferences 中自定义快捷键。

这样一套流程下来,你就可以在 KICKPI Ubuntu 上直接输入中文了。

可以把你的步骤整理得更规范、结构化,并加上必要的说明和安全提示:


在国内机器使用清华 TUNA 镜像源安装 Docker(Ubuntu/Debian)

1️⃣ 添加 Docker GPG 公钥

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-ce.gpg

用于验证 Docker 软件包的完整性和来源,保证安全。


2️⃣ 添加清华 TUNA 国内镜像源

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

注意:

  • $(dpkg --print-architecture) 自动选择系统架构(amd64 / arm64 等)。
  • $(lsb_release -cs) 自动获取 Ubuntu 版本代号。

3️⃣ 更新 apt 软件源

sudo apt update

4️⃣ 安装 Docker 组件

sudo apt install -y docker-ce docker-ce-cli containerd.io

安装内容:

  • docker-ce:Docker Engine(核心服务)
  • docker-ce-cli:命令行工具
  • containerd.io:容器运行时

5️⃣ 启动并设置 Docker 开机自启

sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker

6️⃣ 测试安装是否成功

docker run hello-world

如果输出欢迎信息,则 Docker 安装成功。


加入docker 权限组

这个错误是因为当前用户 没有权限访问 Docker 的 Unix socket (/var/run/docker.sock​)。正确做法是把用户加入 docker 用户组。操作步骤如下:


1️⃣ 创建 docker 组(如果没有)

sudo groupadd docker

大多数系统安装 Docker 时已经创建了 docker 组,可以忽略这步。


2️⃣ 将当前用户加入 docker 组

sudo usermod -aG docker $USER

-aG 表示追加到组,不会删除已有组。


3️⃣ 重新登录或刷新组权限

# 注销并重新登录,或者执行:
newgrp docker

4️⃣ 测试 Docker 权限

docker run hello-world

如果输出欢迎信息,则说明权限问题已解决,可以不再使用 sudo 来运行 Docker。


✅ 小结:

  1. 创建 docker 组(可选)
  2. 用户加入 docker
  3. 重新登录或刷新组权限
  4. 测试运行

我可以帮你写一个 一条命令就让当前用户拥有 Docker 权限的脚本,执行后立即生效,无需手动注销登录。

你希望我写吗?

Docker Compose V2

好的,我帮你整理一个完整流程,保证 Docker Compose V2 在系统上全局可用,并设置环境变量。


1️⃣ 下载官方二进制

# 下载适合当前系统架构的 Docker Compose V2 二进制
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

这样就可以在 /usr/local/bin​ 全局使用 docker-compose 命令了。


2️⃣ 验证安装

docker-compose version

输出类似:

Docker Compose version v2.24.1

3️⃣ 设置环境变量(可选,确保命令全局生效)

如果系统默认 PATH 没有 /usr/local/bin,可以在用户配置文件中添加:

# 编辑 bash 配置
nano ~/.bashrc

在文件末尾添加:

# Docker Compose
export PATH="/usr/local/bin:$PATH"

保存后使配置生效:

source ~/.bashrc

现在可以在任意目录直接使用:

docker-compose up -d
docker-compose ps

✅ 总结:

  • 直接下载官方二进制 → 跨 Python 版本
  • /usr/local/bin → 默认全局可用
  • 可通过 PATH 确保环境变量生效

你当前目录下有 docker-compose-linux-aarch64 这个二进制文件,但系统还不能全局识别它。

要让 docker-compose​ 命令全局可用,需要把它放到 PATH 中的目录,例如 /usr/local/bin


1️⃣ 移动文件到 /usr/local/bin

sudo mv ~/docker-compose-linux-aarch64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
  • mv​:移动并重命名为 docker-compose
  • chmod +x:赋予可执行权限

2️⃣ 验证安装

docker-compose version

输出类似:

Docker Compose version v2.x.x

3️⃣ 可选:设置 PATH(如果 /usr/local/bin 不在 PATH)

echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

✅ 现在你就可以在任何目录直接运行:

docker-compose up -d
docker-compose ps

如果需要,我可以帮你写一个 一键脚本,把下载好的 docker-compose 文件移动、赋权、设置 PATH,一条命令就能完成全局安装。

你希望我写吗?


Docker 拉取镜像失败(hello-world)的解决办法

报错示例:

docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": read tcp ...: read: connection reset by peer

说明:Docker 客户端尝试访问 Docker Hub 或其他注册中心时网络连接失败,常见原因包括:

  • 网络阻塞或防火墙限制
  • Docker Hub 国内访问慢或被墙
  • Docker 配置中没有配置国内镜像加速

1️⃣ 检查 Docker 服务状态

systemctl status docker

确保 Docker 正常运行,如果未运行先启动:

sudo systemctl start docker

2️⃣ 配置国内镜像加速

  1. 创建或编辑 Docker 配置文件:
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
  1. 添加国内镜像加速配置(示例):
{
  "data-root": "/userdata/docker",
  "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc",
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://dockerproxy.com",
    "https://gst6rzl9.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "http://mirrors.ustc.edu.cn/",
    "https://mirrors.tuna.tsinghua.edu.cn/",
    "http://mirrors.sohu.com/"
  ],
  "insecure-registries": [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug": true,
  "experimental": false
}

⚠️ 注意:

  • "registry-mirrors":配置国内镜像源,提高访问速度
  • "insecure-registries":非 HTTPS 或自建注册中心
  • "debug": true 可帮助排查问题

3️⃣ 重载并重启 Docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

4️⃣ 验证配置是否生效

docker info | grep -i mirror

如果能看到你配置的镜像源,则说明配置生效。


5️⃣ 测试拉取镜像

docker run hello-world

输出欢迎信息,则 Docker 镜像拉取成功。


✅ 小结:

  1. 检查 Docker 服务
  2. 配置国内镜像加速
  3. 重载并重启 Docker
  4. 验证配置
  5. 拉取镜像测试

更改 Docker 镜像、容器等数据的存放目录

可以通过修改 Docker 的 data-root 配置来更改 Docker 镜像、容器等数据的存放目录。下面给你整理一个完整步骤:


1️⃣ 停止 Docker 服务

sudo systemctl stop docker

2️⃣ 创建新的存放目录

sudo mkdir -p /userdata/docker
sudo chown root:root /userdata/docker
sudo chmod 711 /userdata/docker

确保 Docker 用户(通常是 root)有权限访问该目录。


3️⃣ 修改 Docker 配置文件

编辑 /etc/docker/daemon.json(如果不存在则创建):

sudo nano /etc/docker/daemon.json

添加或修改如下内容:
在原来的基础上增加一个条"data-root": "/userdata/docker",

{
  "data-root": "/userdata/docker",
  "registry-mirrors": [
    .....
}

⚠️ 如果文件里已有其他配置项,请注意保留 JSON 格式正确(用逗号分隔)。


4️⃣ 如果想迁移已有镜像(可选)

将原来的 /var/lib/docker 迁移到新目录:

sudo rsync -aP /var/lib/docker/ /userdata/docker/

rsync -aP 会保留权限、时间戳,并显示进度。


5️⃣ 重载并启动 Docker

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker

6️⃣ 验证是否生效

docker info | grep "Docker Root Dir"

输出应为:

Docker Root Dir: /userdata/docker

这样 Docker 的镜像、容器、卷都会统一存放到 /userdata/docker/,避免占用系统分区空间。


安装 gitea

你提供的是一个 Docker Compose v3 配置文件,我帮你优化和整理一下格式,让它更清晰、可维护:

nano docker-compose.yaml


networks:
  gitea:
    external: false

services:
  server:
    image: docker.gitea.com/gitea:1.24.6
    container_name: gitea
    restart: always
    networks:
      - gitea
    depends_on:
      - db
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"  # Web UI
      - "222:22"     # SSH

  db:
    image: postgres:14
    container_name: gitea-db
    restart: always
    networks:
      - gitea
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=gitea
      - POSTGRES_DB=gitea
    volumes:
      - ./postgres:/var/lib/postgresql/data

优化点说明

  1. 统一缩进与顺序

    • networks​ → environment​ → volumes​ → ports
    • 便于阅读和维护
  2. 添加容器名称 container_name

    • db​ 改为 gitea-db,避免网络里命名冲突
  3. depends_on

    • 确保 Gitea 启动时数据库容器已经启动
  4. 注释端口用途

    • Web UI、SSH 分别标注,方便理解
  5. 数据库连接

    • Gitea 环境变量中 GITEA__database__HOST=db:5432​ 对应服务名 db(Compose 内部 DNS)

如果你需要,我可以帮你再加一个 完整的可生产部署配置

  • 持久化卷
  • 支持 数据库备份
  • 支持 可选 HTTPS

这样直接 docker-compose up -d 就可以在 RK 或服务器上跑起来。

你希望我帮你做这个吗?

挂载磁盘

好的,我帮你整理一个完整的 磁盘挂载流程,包括先手动挂载、再自动挂载,并考虑开机无法挂载时的容错处理。


1️⃣ 查看磁盘信息

lsblk -f

示例输出:

nvme0n1
└─nvme0n1p1  ext4   NVMe   1d2bc907-40e7-42b1-b3e8-8ca60cf12571  444.5G  0% /mnt/nvme
  • nvme0n1p1 是分区名
  • ext4 是文件系统类型
  • UUID 用于自动挂载更稳定

2️⃣ 手动挂载

  1. 创建挂载点:
sudo mkdir -p /mnt/nvme
  1. 挂载分区:
sudo mount /dev/nvme0n1 /mnt/nvme
  1. 查看挂载状态:
df -h | grep nvme

3️⃣ 设置自动挂载(开机生效)

编辑 /etc/fstab

sudo nano /etc/fstab

添加一行(推荐使用 UUID):

UUID=1d2bc907-40e7-42b1-b3e8-8ca60cf12571 /mnt/nvme ext4 defaults,nofail 0 2

说明:

  • UUID​:用 blkid /dev/nvme0n1p1 查看
  • /mnt/nvme:挂载点
  • ext4:文件系统类型
  • defaults:默认挂载参数
  • nofail:开机无法挂载时继续启动,不阻塞系统
  • 0 2:备份与 fsck 顺序

4️⃣ 测试自动挂载配置

sudo umount /mnt/nvme
sudo mount -a
  • 如果没有报错,说明 /etc/fstab 配置正确
  • 可以重启验证自动挂载是否生效:
sudo reboot
df -h | grep nvme

5️⃣ 容错注意事项

  • nofail:分区不存在或损坏时不会阻塞启动
  • x-systemd.device-timeout=30s(可选):系统尝试挂载超时 30 秒后继续启动

示例:

UUID=1d2bc907-40e7-42b1-b3e8-8ca60cf12571 /mnt/nvme ext4 defaults,nofail,x-systemd.device-timeout=30s 0 2

这样做可以保证:

  1. 手动测试挂载正常
  2. 开机自动挂载
  3. 开机挂载失败时不影响系统启动

如果你希望,我可以帮你写一个 一键脚本

  • 创建挂载点
  • 挂载磁盘
  • 自动写入 /etc/fstab 并带容错参数
  • 测试挂载

jellyfin 安装

好的 ,把你这条 docker run​ 转换成 docker-compose.yml 配置如下:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    network_mode: host
    volumes:
      - /srv/jellyfin/config:/config
      - /srv/jellyfin/cache:/cache
      - /mnt/nvme/media:/media
    restart: unless-stopped

说明:

  • network_mode: host​ 保持和 --net=host 一致。
  • volumes​ 保持和你 -v 参数相同。
  • restart: unless-stopped 保证容器异常退出后会自动重启。
  • container_name: jellyfin 方便管理。

⚡ 用法:

  1. 在某个目录下新建 docker-compose.yml 文件,内容就是上面的配置。

  2. 启动:

    docker compose up -d
    
  3. 停止:

    docker compose down
    

要不要我帮你加上 日志路径挂载(比如 /srv/jellyfin/log:/log),方便排错?

明白了,你想用 FileBrowser,它的优点是:

  • 网页界面,支持直接上传/下载文件;
  • 类似轻量 NAS 文件管理器;
  • 账号管理方便,支持权限控制。

filebrowser 安装

filebrowser 的默认账号密码

admin

密码需要使用 docker logs -f xxxxxx(容器ID)来查看

权限问题:

你提到:

“kickpi 已经在组里面了,而且可以访问 nvme,也可以在里面创建文件”

这说明 宿主机上权限是没问题的,但容器内仍然报:

open /srv: permission denied

这就指向一个更隐蔽但常见的问题:Docker 挂载目录时,容器内用户虽然 UID 匹配,但可能因挂载上下文或命名空间限制无法继承宿主机的组权限


根本原因:容器内进程无法继承宿主机的补充组(supplementary groups)

  • 虽然 kickpi​ 在宿主机属于 shared 组,
  • Docker 容器默认不会自动将宿主机用户的补充组(如 shared)传递给容器内进程
  • 容器内 UID 1000 的进程只知道自己的 UID/GID(通常是 1000:1000)不知道它在宿主机还属于 shared
  • 因此,尽管宿主机上 kickpi​ 能访问 /mnt/nvme​,容器内 UID 1000 却只能以“其他用户”身份访问,而你的目录权限是 drwxrwx---(others 无权限),所以被拒绝。

✅ 这就是为什么宿主机能访问,容器却不能!


✅ 解决方案

✅ 方法一:显式将容器内用户加入 shared组(通过 GID)

  1. 先查 shared组的 GID

    getent group shared
    

    输出类似:

    shared:x:1001:
    

    → 记下 GID,比如是 1001

  2. 修改 docker-compose.yml,使用 group_add添加组

    version: "3"
    services:
      filebrowser:
        image: filebrowser/filebrowser:latest
        container_name: filebrowser
        restart: unless-stopped
        ports:
          - "8089:80"
        environment:
          - TZ=Asia/Shanghai
        volumes:
          - /mnt/nvme:/srv
          - ./config:/config
          - ./db:/database
          - /etc/localtime:/etc/localtime:ro
        # 关键:添加宿主机 shared 组的 GID
        group_add:
          - 1001   # ← 替换为你的 shared 组实际 GID
    
  3. 重启服务

    docker-compose down
    docker-compose up -d
    

group_add​ 会让容器内进程额外拥有该 GID 的权限,从而能访问 group=rwx 的目录。


✅ 方法二:修改 /mnt/nvme权限,让“其他用户”可读+执行(快速验证)

如果你只是想快速验证是否是组权限问题:

sudo chmod o+rx /mnt/nvme

然后访问 Web 界面。如果可以了,说明确实是组权限问题,建议回退并用方法一(更安全)。

回退命令:

sudo chmod o-rx /mnt/nvme  # 恢复原权限

✅ 方法三:以宿主机用户身份运行容器(指定 user)

如果你知道 kickpi​ 的 UID 和 shared 的 GID(比如 1000:1001),也可以:

user: "1000:1001"

但注意:FileBrowser 镜像内可能没有 GID 1001 的组,不过 Linux 文件权限只看 GID 数字,所以仍然有效

services:
  filebrowser:
    # ...
    user: "1000:1001"   # UID:GID
    volumes:
      - /mnt/nvme:/srv
      # ...

⚠️ 但某些应用对主 GID 敏感,group_add 更安全灵活。


验证容器内权限(调试用)

你可以进入容器检查:

docker exec -it filebrowser sh

然后执行:

id                    # 查看 UID/GID 和所属组
ls -ld /srv           # 看是否能访问

如果没加 group_add,输出可能是:

uid=1000 gid=1000 groups=1000
ls: cannot open directory '/srv': Permission denied

加了之后:

uid=1000 gid=1000 groups=1000,1001
# 此时就能访问了

✅ 总结

问题 原因 解决
宿主机能访问 /mnt/nvme,容器不能 容器内进程不知道宿主机的补充组(如 shared docker-compose.yml​ 中使用 group_add: [GID]

操作步骤:

  1. getent group shared → 得到 GID(如 1001)

  2. docker-compose.yml​ 的 filebrowser 服务下添加:

    group_add:
      - 1001
    
  3. docker-compose up -d 重启

完成后,FileBrowser 就能正常访问 /mnt/nvme 中的文件了!✅

安装思源笔记

你提供的命令来自思源笔记官方文档,使用了:

  • 挂载工作区目录
  • 设置 PUID​/PGID
  • 通过命令行参数指定 --workspace​ 和 --accessAuthCode

但要注意:思源笔记 Docker 镜像(b3log/siyuan)并不真正支持 PUID/PGID环境变量(这是 LinuxServer 镜像的特性),它内部使用固定用户 siyuan​(UID 1000),不过它会读取 --workspace --accessAuthCode参数


✅ 正确转换为 docker-compose.yml

根据你的 docker run​ 命令,等效的 docker-compose.yml 如下:

version: "3"
services:
  siyuan:
    image: b3log/siyuan:latest
    container_name: siyuan
    restart: unless-stopped
    ports:
      - "6806:6806"
    environment:
      - TZ=Asia/Shanghai
      # 注意:PUID/PGID 实际无效,但可保留(无害)
      - PUID=1001
      - PGID=1002
    volumes:
      # 将宿主机的 workspace_dir_host 挂载到容器内的 workspace_dir_container
      # 例如:./workspace:/siyuan/workspace
      - ./workspace:/siyuan/workspace
    command: >
      --workspace=/siyuan/workspace
      --accessAuthCode=your_secure_password
    # 可选:显式指定用户(推荐,避免权限问题)
    # user: "1001:1002"

使用说明

  1. 替换路径
    ./workspace 改为你实际的宿主机目录,例如:

    volumes:
      - /home/kickpi/siyuan-workspace:/siyuan/workspace
    
  2. 设置强密码
    your_secure_password 替换为你的访问授权码,例如:

    command: >
      --workspace=/siyuan/workspace
      --accessAuthCode=MySiyuan@2025!
    
  3. 权限建议(重要)
    虽然 PUID=1001​ / PGID=1002不会被镜像自动应用,但你可以手动指定 user 来确保权限一致:

    user: "1001:1002"
    

    并提前设置宿主机目录权限:

    sudo chown -R 1001:1002 /path/to/workspace_dir_host
    

为什么推荐用 command 而不是环境变量?

  • 思源笔记 只接受 --accessAuthCode命令行参数(或等效的 SIYUAN_ACCESS_AUTH_CODE 环境变量)。
  • 官方同时支持两种方式,但 命令行参数优先级更高
  • 使用 command​ 更贴近你原始的 docker run 逻辑。

你也可以改用环境变量方式(更简洁):

environment:
  - SIYUAN_ACCESS_AUTH_CODE=your_secure_password
command: --workspace=/siyuan/workspace

两者等效,任选其一。


✅ 最终推荐配置(带权限控制)

version: "3"
services:
  siyuan:
    image: b3log/siyuan:latest
    container_name: siyuan
    restart: unless-stopped
    ports:
      - "6806:6806"
    environment:
      - TZ=Asia/Shanghai
      - SIYUAN_ACCESS_AUTH_CODE=MySiyuan@2025!   # ← 推荐用 env var
    volumes:
      - ./workspace:/siyuan/workspace
    command: --workspace=/siyuan/workspace
    user: "1000:1000"  # 与宿主机普通用户一致(通常是 kickpi)

然后执行:

mkdir -p ~/siyuan/workspace
sudo chown -R 1000:1000 ~/siyuan/workspace
cd ~/siyuan
docker-compose up -d

✅ 验证

访问 http://IP:6806​,输入授权码 MySiyuan@2025!,即可进入初始化界面。

现在你已完全按照官方 docker run 示例,在 Compose 中正确部署思源笔记!

安装EMQX

安装互传服务

qBittorrent WebUI 下载服务安装

Navidrome 安装

docker-compose.yml

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    ports:
      - "4533:4533"
    environment:
      ND_SCANSCHEDULE: 1h
      ND_LOGLEVEL: info
      ND_SESSIONTIMEOUT: 24h
      ND_BASEURL: ""
    volumes:
      - ./navidrome_data:/data
      - /mnt/nvme/media/music:/music:ro  # 替换为你的音乐目录
    user: "1000:1000"  # 可选:指定用户ID,避免权限问题
    restart: unless-stopped
    group_add:
      - 1001

解决启动不了的问题:

你遇到的错误:

FATAL: Error creating cache path: mkdir /data/cache: permission denied

说明 Navidrome 没有权限在 /data目录下创建 cache文件夹。这通常发生在使用 Docker 部署时,且挂载的卷(volume)权限配置不当。


问题原因

  • 你在 docker-compose.yml​ 或 docker run​ 中将数据目录挂载到了容器内的 /data(这是 Navidrome 默认的数据目录)。
  • 但宿主机上对应的目录(比如 ./navidrome_data​)所属用户不是 Navidrome 容器内运行的用户(默认 UID=1000)。
  • 容器内的进程尝试在 /data​ 下创建 cache/​、db/ 等子目录时,因权限不足而失败。

✅ 解决方案

✅ 方法一:修改宿主机目录权限(推荐)有效

假设你的 docker-compose.yml 中有:

volumes:
  - ./navidrome_/data
  - /your/music:/music:ro

那么你需要确保 ./navidrome_data 目录对 UID=1000 可写:

# 创建目录(如果还没创建)
mkdir -p ./navidrome_data

# 设置权限:让 UID 1000(普通用户)拥有写权限
sudo chown -R 1000:1000 ./navidrome_data

大多数 Linux 系统中,第一个普通用户的 UID 是 1000。Navidrome 官方镜像默认以 UID=1000 运行。


验证是否解决

执行:

docker-compose down
docker-compose up -d

查看日志:

docker-compose logs navidrome

应该不再出现 permission denied,而是显示:

INFO Starting Navidrome server...
INFO Scanning music folder...

补充建议

  • 不要手动在宿主机上创建 /data/cache,让 Navidrome 自动创建。
  • 确保音乐目录(/music​)至少对容器用户 可读chmod -R a+r /your/music)。
  • 如果使用 NAS 或挂载的外部存储,注意文件系统是否支持 Linux 权限(如 NTFS/FAT32 不支持 UID/GID)。

安装 node-red

要使用 Docker 导出 nodered/node-red:latest​ 镜像,可以使用 docker save 命令将其保存为一个 tar 文件。以下是具体步骤:

1. 确认镜像存在

首先确认本地已有该镜像(根据你提供的信息,镜像 ID 为 bc6a60b67ad4):

docker images | grep nodered

2. 导出镜像

使用 docker save 命令导出镜像:

docker save -o nodered-node-red-latest.tar nodered/node-red:latest

或者使用镜像 ID:

docker save -o nodered-node-red-latest.tar bc6a60b67ad4

✅ 推荐使用镜像名称(nodered/node-red:latest),因为这样导出的 tar 文件在导入时会保留原始的仓库名和标签。

3. 验证导出文件

导出完成后,你会在当前目录下看到一个名为 nodered-node-red-latest.tar 的文件,大小约为 600MB 左右。

ls -lh nodered-node-red-latest.tar

4. (可选)压缩文件以节省空间

由于 tar 文件较大,你可以用 gzip 压缩它:

gzip nodered-node-red-latest.tar
# 生成 nodered-node-red-latest.tar.gz

5. 如何导入该镜像(供参考)

在其他机器上,可以使用以下命令导入:

docker load -i nodered-node-red-latest.tar
# 或如果压缩了:
gunzip -c nodered-node-red-latest.tar.gz | docker load

总结命令

docker save -o nodered-node-red-latest.tar nodered/node-red:latest

这样就成功将镜像导出为一个可移植的 tar 文件了。

posted @ 2025-10-16 16:53  zart2007  阅读(20)  评论(0)    收藏  举报