所以我必须以root身份在容器中运行进程。然后,它们使用预定义的非root用户生成进程。但是,在主进程启动后,我希望所有其他命令都以非root用户身份执行,包括容器外部的exec。
如果我在Dockerfile中使用USER user
-主进程也以user
开始,它会破坏逻辑。(我知道最佳实践不是以root身份运行容器进程,但在某些情况下,这是必要的)
在容器运行之后,我可以通过在docker或docker-compose命令中显式指定用户来执行非root user
。但是,我希望默认为非root用户,而不在每个CLI命令中显式指定它。USER user
的行为(或docker-compose文件中的user
)。有办法做到吗?
反过来也可以:如果我可以设置USER user
,但显式地运行主进程为root
忽略该指令?
编辑:还尝试在入口点结束时运行su - user
。虽然这使得入口点本身的下一个命令作为非root用户执行,但它并没有使默认用户成为非root用户,这意味着docker exec
仍然使用root用户。
最终结果应该是这样的:
- 来自entrypoint的命令应该作为
root
执行。 - 其他所有操作都应该由非root
user
执行。 - 当你运行
docker-compose exec container command
时,它应该与非根user
一起运行,而不需要显式地指定它。 - 如果运行
docker exec container command
,它也应该是非根user
,而不需要显式指定。
1条答案
按热度按时间k2arahey1#
您已经正确地确定了在Dockerfile中设置
USER user
将导致主进程以非root用户身份运行,这在您的情况下可能是不希望的。为了满足您的需求,您可以采用以下方法:
1.Dockerfile:
1.start.sh:
在
start.sh
脚本中,您可以使用条件逻辑根据环境变量或任何其他条件来确定是以root用户身份运行还是以非root用户身份运行:确保将
non_root_user
替换为您想要使用的实际非root用户。1.Docker Compose:
在
docker-compose.yml
中,您可以指定一个环境变量来控制是否以root或非root身份运行:这样,当您通过
docker-compose
启动容器时,它将在RUN_AS_ROOT
环境变量设置为true
的情况下运行,而您的start.sh
脚本将以root身份执行主进程。如果您想以非root用户的身份运行它,您可以简单地省略
docker-compose.yml
中的environment
部分,默认行为将是以非root用户的身份运行。