Skip to content

setup_script

在应用移植时,偶尔会遇到进程权限和lzcapp默认权限(root)不一致,或需要在容器启动前执行一些初始化操作。

manifest.yml:services[].setup_script字段可以处理相关问题。

容器进程UID

如果仅是用户权限问题,您可以使用manifest.yml:services[].user字段调整UID

setup_script的原理是替换docker image本身的entrypoint/command参数,执行完setup_script后由lzcos 自动在执行原始的entrypoint/command逻辑。

使用setup_script时需要注意其运行时机

  1. 每次容器启动时都会重新执行一次。因此请注意不要重复进行有副作用的操作。
  2. manifest.yml:services[].binds是在容器进入created状态时就已经操作完毕,此时setup_script还未执行
  3. 原始entrypoint/command是在setup_script之后执行,因此不能依赖容器镜像本身的一些初始化状态

比如

yaml
services:
  cloudreve:
    image: registry.lazycat.cloud/xxxxx/cloudreve/cloudreve:a9e2373b7ca59bc4
    binds:
      # 先将应用var目录下的一个子目录bind到应用原生的存储目录,
      # 避免修改上游代码。(这里假设是/conf/目录)
      - /lzcapp/var/cloudreve:/conf/

    # 然后把lpk里的预装配置拷贝到/conf目录
    setup_script: |     # 这个"|"是yml的字符串多行语法,
    if [ -z "$(find /conf -mindepth 1 -maxdepth 1)" ]; then
        cp -r /lzcapp/pkg/content/defaults/ /conf/
    fi
services:
  cloudreve:
    image: registry.lazycat.cloud/xxxxx/cloudreve/cloudreve:a9e2373b7ca59bc4
    binds:
      # 先将应用var目录下的一个子目录bind到应用原生的存储目录,
      # 避免修改上游代码。(这里假设是/conf/目录)
      - /lzcapp/var/cloudreve:/conf/

    # 然后把lpk里的预装配置拷贝到/conf目录
    setup_script: |     # 这个"|"是yml的字符串多行语法,
    if [ -z "$(find /conf -mindepth 1 -maxdepth 1)" ]; then
        cp -r /lzcapp/pkg/content/defaults/ /conf/
    fi