Docker容器Entrypoint中rsync执行报错问题排查
问题分析与解决
错误原因
你使用了exec形式的ENTRYPOINT(数组语法),这种模式下Docker会直接执行指定命令,不会通过Shell解析参数。因此/var/www/html2/*里的通配符*不会被展开,rsync会把它当作一个名为*的具体文件去查找,自然找不到对应文件,从而报错。
解决方案
以下是几种可行的修复方式:
方式1:改用Shell形式的ENTRYPOINT
让Shell处理通配符展开,将ENTRYPOINT改为字符串形式:
ENTRYPOINT /usr/bin/rsync -r -A /var/www/html2/* /var/www/html/
方式2:去掉通配符,使用rsync目录同步语法
rsync支持通过目录末尾的斜杠同步目录内所有内容,无需依赖Shell通配符。修改ENTRYPOINT为:
ENTRYPOINT ["/usr/bin/rsync", "-r", "-A", "/var/www/html2/", "/var/www/html/"]
注意:
/var/www/html2/末尾的斜杠是关键,它表示同步该目录下的所有内容到目标目录;如果不带斜杠,会把html2目录本身复制到html目录下,形成/var/www/html/html2结构。
方式3:使用自定义Shell脚本作为Entrypoint
如果后续需要添加更多启动逻辑,推荐编写简单的Shell脚本:
- 在Dockerfile同目录下创建
entrypoint.sh:
#!/bin/sh /usr/bin/rsync -r -A /var/www/html2/* /var/www/html/ # 可在此添加其他启动命令,例如启动php-fpm exec php-fpm
- 给脚本添加执行权限:
chmod +x entrypoint.sh - 修改Dockerfile:
COPY entrypoint.sh /usr/local/bin/ ENTRYPOINT ["entrypoint.sh"]
验证
修改后重新构建镜像并启动容器,rsync即可正常同步html2目录下的内容到html目录。
内容的提问来源于stack exchange,提问作者user3387349
相关产品推荐
相关产品推荐

