求群晖 Docker 部署思源,PC 端 Drive 无法同步解决方案

本贴最后更新于 1076 天前,其中的信息可能已经水流花落

用户权限

镜像中是使用默认创建的普通用户 siyuan(uid 1000/gid 1000)来启动内核进程的,所以在宿主机创建工作空间文件夹时请注意设置该文件夹所属用户组:chown -R 1000:1000 /siyuan/workspace,在启动容器时需要带参数 -u 1000:1000

Docker 部署脚本

docker run -itd \
-u 1000:1000 \
-e TZ=Asia/Shanghai \
-e LANG=zh_CN.UTF-8 \
-e LC_ALL=zh_CN.UTF-8 \
-v <PATH_DIR>:/SiYuan/ \
--restart=always \
--network=host \
--name siyuan \
b3log/siyuan:latest -resident -workspace /SiYuan -accessAuthCode <YOUR_PASSWORD> -servePath <domain:port> -ssl
  • <PATH_DIR>:是在 Synology Drive 下建的文件夹,用来同步 PC 端的思源

问题

由于用户权限需要为 -u 1000:1000,故需要用 chown -r 1000:1000 设置 PATH_DIR 所属用户与用户组。这将导致 Synology Drive 识别该文件夹所属用户为 未知用户 且无法同步。

使用 Synology Drive 同步数据原由

Web 端缺少部分功能,如:导出 WordPDF...。PC 端软件为生产主力,移动端使用 Web 查看,避开安卓 data 权限不好获取问题(不要说 Folder Sync,需要 WebDav,群晖套件也没法添加额外目录,除非再 docker 部署一个)。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23020 引用 • 92599 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8449 引用 • 38491 回帖 • 155 关注

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 可以给个 Dockerfile 么?

    1 回复
  • 其他回帖
  • 一、修改容器用户 UID 和 GID

    docker 容器内的用户也算是千奇百怪了……一般情况下是没有什么影响的,但是有时我们想通过 volume 把内容挂在出来的时候,就会出现权限的问题了。如果都改成 777 明显是不合适的。如 LinuxServer 提供的容器一般都会提供通过环境变量的方式来修改 UIDGID。当然如果你千年不变的用 root 那么当我什么也没说了……

    通过给 TiddlyWiki 制作 docker 镜像的时候,实现了一个动态修改 UIDGID 的方案。通过启动 entrypoint.sh 来修改容器内用户的信息达到和容器外用户一致的 UIDGID

    dockerfile

    FROM node:lts-alpine3.13
    MAINTAINER liuwentao@gmail.com
    
    RUN \
    echo "https://mirrors.cloud.tencent.com/alpine/v3.11/main/" > /etc/apk/repositories && \
    echo "https://mirrors.cloud.tencent.com/alpine/v3.13/community/" >> /etc/apk/repositories && \
    apk add shadow && \
    useradd -u 666 -U -d /config -s /bin/false abc && \
    usermod -G users abc && \
    npm install -g tiddlywiki@5.1.23 --registry=https://registry.npm.taobao.org
    
     
    EXPOSE 8080
    VOLUME [ "/app" ]
    WORKDIR /app
    COPY entrypoint.sh /entrypoint.sh
    
    RUN chmod +x /entrypoint.sh
    CMD [ "/entrypoint.sh" ]
    

    #!/usr/bin/env sh
    PUID=${PUID:-911}
    PGID=${PGID:-911}
    groupmod -o -g "$PGID" abc
    usermod -o -u "$PUID" abc
    
    groupmod -o -g "$PGID" abc
    usermod -o -u "$PUID" abc
    
    chown abc:abc /app
    
    if [ ! -f "/app/tiddlywiki.info" ]; then
        tiddlywiki /app --init server
    fi
    
    tiddlywiki /app --listen host=0.0.0.0
    

    核心是通过 groupmodusermod 修改用户 abcUIDGID。这两个软件在 alpine 中对应的软件包是 shadow

  • 三、参考 Gitea Dockerfile

    环境变量

    您可以通过环境变量配置 Gitea 的一些设置:

    ###################################
    #Build stage
    FROM golang:1.17-alpine3.13 AS build-env
    
    ARG GOPROXY
    ENV GOPROXY ${GOPROXY:-direct}
    
    ARG GITEA_VERSION
    ARG TAGS="sqlite sqlite_unlock_notify"
    ENV TAGS "bindata timetzdata $TAGS"
    ARG CGO_EXTRA_CFLAGS
    
    #Build deps
    RUN apk --no-cache add build-base git nodejs npm
    
    #Setup repo
    COPY . ${GOPATH}/src/code.gitea.io/gitea
    WORKDIR ${GOPATH}/src/code.gitea.io/gitea
    
    #Checkout version if set
    RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
     && make clean-all build
    
    # Begin env-to-ini build
    RUN go build contrib/environment-to-ini/environment-to-ini.go
    
    FROM alpine:3.13
    LABEL maintainer="maintainers@gitea.io"
    
    EXPOSE 22 3000
    
    RUN apk --no-cache add \
        bash \
        ca-certificates \
        curl \
        gettext \
        git \
        linux-pam \
        openssh \
        s6 \
        sqlite \
        su-exec \
        gnupg
    
    RUN addgroup \
        -S -g 1000 \
        git && \
      adduser \
        -S -H -D \
        -h /data/git \
        -s /bin/bash \
        -u 1000 \
        -G git \
        git && \
      echo "git:*" | chpasswd -e
    
    ENV USER git
    ENV GITEA_CUSTOM /data/gitea
    
    VOLUME ["/data"]
    
    ENTRYPOINT ["/usr/bin/entrypoint"]
    CMD ["/bin/s6-svscan", "/etc/s6"]
    
    COPY docker/root /
    COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
    COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
    RUN ln -s /app/gitea/gitea /usr/local/bin/gitea
    

    entrypoint:

    #!/bin/sh
    
    if [ "${USER}" != "git" ]; then
        # rename user
        sed -i -e "s/^git\:/${USER}\:/g" /etc/passwd
    fi
    
    if [ -z "${USER_GID}" ]; then
      USER_GID="`id -g ${USER}`"
    fi
    
    if [ -z "${USER_UID}" ]; then
      USER_UID="`id -u ${USER}`"
    fi
    
    ## Change GID for USER?
    if [ -n "${USER_GID}" ] && [ "${USER_GID}" != "`id -g ${USER}`" ]; then
        sed -i -e "s/^${USER}:\([^:]*\):[0-9]*/${USER}:\1:${USER_GID}/" /etc/group
        sed -i -e "s/^${USER}:\([^:]*\):\([0-9]*\):[0-9]*/${USER}:\1:\2:${USER_GID}/" /etc/passwd
    fi
    
    ## Change UID for USER?
    if [ -n "${USER_UID}" ] && [ "${USER_UID}" != "`id -u ${USER}`" ]; then
        sed -i -e "s/^${USER}:\([^:]*\):[0-9]*:\([0-9]*\)/${USER}:\1:${USER_UID}:\2/" /etc/passwd
    fi
    
    for FOLDER in /data/gitea/conf /data/gitea/log /data/git /data/ssh; do
        mkdir -p ${FOLDER}
    done
    
    if [ $# -gt 0 ]; then
        exec "$@"
    else
        exec /bin/s6-svscan /etc/s6
    fi
    
  • 二、# 如何优雅的在 Docker 容器中指定用户及组权限的三种方式

    如果平常有在玩 Docker 的用户肯定知道透过 docker command 启动的容器预设是使用 root 用户来当作预设使用者及群组的。这样就会遇到一个问题,当主机环境你拥有 root 权限时就没有此问题。如果你没有 root 权限,又有需求在 Docker 容器內挂上 Volume,会发现产生出来的文件皆会是 root 权限,这时候在主机完全是无法写入的。本篇文章将教大家三种方式来设定容器使用者权限,以解决上述遇到的问题。

    使用 docker 指令时指定使用者

    以进入一个 Ubuntu 容器为例,通过以下指令:

    $ docker run -ti ubuntu /bin/bash
    

    这时候我们可以通过 -u 方式将使用者 uid 及群组 gid 传入容器内。

    $ mkdir tmp
    $ docker run -ti -v $PWD/tmp:/test \
      -u uid:gid ubuntu /bin/bash
    

    如何找到目前使用者 uid 及 gid 呢,可以通过下面的方式。

    $ id -u
    $ id -g
    

    为了更加方便,上述指令可以改成:

    $ docker run -ti -v $PWD/tmp:/test \
      -u $(id -u):$(id -g) ubuntu /bin/bash
    

    使用 Dockerfile 指定使用者

    除了在 Docker 命令行指定外,你也可以在 dockerfile 内直接指定使用者。

    # Dockerfile
    USER 1000:1000
    

    我个人不是很推荐这方式,除非是在 container 内独立建立使用者,并且指定权限。

    通过 docker-compose 指定权限

    通过 docker-compose 可以一次启动多个服务。用 user 可以指定使用者权限来写入特定的 volume。

    services:
      agent:
        image: xxxxxxxx
        restart: always
        networks:
          - proxy
        logging:
          options:
            max-size: "100k"
            max-file: "3"
        volumes:
          - ${STORAGE_PATH}:/data
        user: ${CURRENT_UID}
    

    接着可以通过 .env 来指定变量的值。

    STORAGE_PATH=/home/deploy/xxxx
    CURRENT_UID=1001:1001
    

    总结

    以上场景通常会发生在有挂载主机 Volume 进入容器内,但是你又没有 root 用户权限时。如果此时不指定使用者权限,这样生成出来的文件都会是 root 权限,一般用户无法写入,只能读取。

  • 查看全部回帖

推荐标签 标签

  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 584 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 1 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1520 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 2 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 50 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    407 引用 • 3578 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 34 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 15 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    156 引用 • 3792 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 626 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 317 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 715 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 635 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 699 关注
  • CodeMirror
    1 引用 • 2 回帖 • 129 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 626 关注
  • 倾城之链
    23 引用 • 66 回帖 • 138 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    313 引用 • 547 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 745 关注