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
时需要注意其运行时机
- 每次容器启动时都会重新执行一次。因此请注意不要重复进行有副作用的操作。
manifest.yml:services[].binds
是在容器进入created状态时就已经操作完毕,此时setup_script
还未执行- 原始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