我有以下脚本:
#!/bin/bash
su newuser
node index.js
此脚本是docker容器的入口点。
运行容器时,我看到脚本已执行,然后切换到newuser。但是,不会调用index.js。但是,一旦我键入“ exit”退出newuser,index.js就开始运行。
请问有人可以解释这里的问题吗?
答案 0 :(得分:2)
su newuser
将创建一个新的外壳。基本上,该命令启动一个需要花费时间才能退出的进程。只有退出后,原始bash脚本中的下一个命令才会执行。
如果要以newuser身份运行节点,请改用以下命令:
su newuser -c "node index.js"
您可能还希望包括节点的完整路径,因为以这种方式启动脚本通常不会带来您期望的完整环境(与运行完整的shell相比,PATH可能不完整):>
su newuser -c "/path/to/node index.js"
答案 1 :(得分:1)
如果该脚本是入口点脚本,则完全不需要设置用户名; Dockerfile中的USER指令可以设置(默认)用户名或用户ID。
对于这种简单的设置,我根本不会使用入口点脚本。我要放入Dockerfile
USER newuser
CMD ["node", "index.js"]
通常,我会避免运行固定命令的入口点脚本或ENTRYPOINT指令(并且更喜欢CMD而不是ENTRYPOINT),因为它们会使事情变得非常有用,否则它们将非常有用
docker run --rm -it myimage sh