在Linux Alpine下的bash脚本中,它们具有(第8行):

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

评论


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

#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