exec su-exec "$ZOO_USER" " su -c "CMD ["zkServer.sh", "start-foreground"]
$@" $ZOO_USER
" "$@"
据我所知,
su-exec
是一个Apache httpd依赖-我可以避免安装到目前为止,我已经测试过:
但是通过Docker
CMD
的调用显示我可能会有某种转义/引号错误,No passwd entry for user 'start-foreground'
导致以下输出;显然,命令序列中的用户名字段存在错误。
q4312078q
但是,与原来的(su-exec)有什么区别呢?以及如何使用
su
正确处理它? /github.com/ncopa/su-exec #1 楼
su
的错误参数顺序$ZOO_USER
必须是su
的第一个参数,随后是"$@"
。可以在用户名之前使用选项。最好将它们用双引号引起来,这样一来,如果有人不小心在其中插入空格,就不会有问题。您的错误消息强调这是参数问题的顺序。 >
甚至更好
根据评论,这会更好:
su -c "su -c "su
su [OPTIONS] [-] [username]
Change user id or become root
Options:
-p, -m Preserve environment
-c CMD Command to pass to 'sh -c'
-s SH Shell to use instead of default shell
" "$ZOO_USER" -- "$@"
" "$ZOO_USER" "$@"
su手册摘录
可以在用户名之后提供其他参数,在这种情况下,它们会提供给用户的登录shell。特别是,
-c
的参数将导致大多数命令解释器将下一个参数视为命令。该命令将由/etc/passwd
中为目标用户指定的shell执行。您可以使用
--
参数将su
选项与提供给shell的参数分开。busybox docs摘录:
OP在一条评论中询问为什么这在Alpine Linux中不起作用。由于高山基于
busybox
,因此我查找了busybox文档。 根据文档,busybox不支持向
su
发送其他参数:q4312078q
#2 楼
此脚本中的su-exec程序实际上是Natanael Copa创建的Alpine版本。它是从OP的Dockerfile的第6行安装的。
Alpine su-exec程序可以代替gosu。这两个程序用于以特定用户的身份执行命令,并且具有与通常用户可用的环境变量和权限相同的环境变量和权限。
因此,您可以有效地从容器内部的root用户“降级”,以用户身份而不是以root用户身份运行特定命令。
因此,Ubuntu中的替代解决方案是自行安装没有依赖性的gosu,并在
docker-entrypoint.sh
脚本中使用:gosu "$ZOO_USER" "$@"
(根据下面@ alexey-shrub的评论)
评论
gosu示例:exec / usr / sbin / gosu用户“ $ @”
–阿列克谢灌木
19年11月20日在14:56
评论
ZOO_USER必须是su的最后一个参数,因此通常最好添加-将su选项与-c的shell选项分开。即:su -c“ $ 0”“ $ ZOO_USER”-“ $ @”以避免su接受命令的参数
–滕西拜
17年10月10日在16:24
为什么$ ZOO_USER需要成为最后一个参数?
–小鸡
17年11月10日在16:25
从手册页:su [选项] [用户名],例如su -c命令用户名-传递给命令的其余选项
–滕西拜
17-11-10在16:25
我引用了上面支持我的解决方案的手册页的一部分。
–小鸡
17年11月10日在16:26
busybox su将在Alpine Linux中使用,根据文档,它不支持其他参数。
–小鸡
17年11月17日下午4:01