Docker Ubuntu容器内创建系统符号链接时权限报错问题求助
问题根因
你遇到的报错包含两个核心问题:
- 报错中的
$'\r'是Windows格式换行符导致的,你编写的.sh脚本使用了CRLF换行,Linux系统无法识别,会把行尾的回车符识别为文件名的一部分 Permission denied是权限不足导致:容器内命令使用node用户执行,该用户没有挂载目录/var/www的写入权限,也没有默认的sudo执行权限
可行解决方案
修复脚本换行符
把test-dev.init.sh的换行格式改为LF:可以用编辑器(如VSCode)右下角点击换行符标识切换,或本地执行转换命令:dos2unix test-dev.init.sh修复权限问题,可选以下任意一种方案:
- (推荐)把符号链接创建逻辑移到Dockerfile中,构建阶段默认使用root权限,不会有权限问题,在
test-dev.dockerfile末尾添加:
RUN ln -s /opt/couchbase/bin/cbbackupmgr /usr/local/bin/cbbackupmgr全局路径下所有用户都可以直接调用,不需要操作挂载的宿主机目录。
- 给node用户开放免密sudo权限,在
test-dev.dockerfile末尾添加:
RUN echo "node ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers然后修改
services.yml中的command,执行脚本时加sudo:command: bash -c 'sudo sh ../../docker/test-dev.init.sh && yarn && yarn dev'- 测试环境可直接开放宿主机对应目录的写入权限,在宿主机对应目录执行:
chmod 777 ../modules/dir/bin- (推荐)把符号链接创建逻辑移到Dockerfile中,构建阶段默认使用root权限,不会有权限问题,在
额外检查项
你脚本中写的目标路径是/var/www/modules/dir/bin/cbbackupmgr,但报错显示的路径是/var/www/modules/backupmgr/bin/,先确认路径是否拼写正确,同时可以在test-dev.init.sh开头添加目录创建逻辑,避免父目录不存在导致的报错:mkdir -p /var/www/modules/dir/bin ln -s /opt/couchbase/bin/cbbackupmgr /var/www/modules/dir/bin/cbbackupmgr
内容的提问来源于stack exchange,提问作者liz
相关产品推荐
相关产品推荐

