在容器启动后更改默认Docker用户

9ceoxa92  于 2023-10-16  发布在  Docker
关注(0)|答案(1)|浏览(285)

所以我必须以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,而不需要显式指定。
k2arahey

k2arahey1#

您已经正确地确定了在Dockerfile中设置USER user将导致主进程以非root用户身份运行,这在您的情况下可能是不希望的。
为了满足您的需求,您可以采用以下方法:
1.Dockerfile

# Set up your container as needed, but avoid specifying USER here
# ...

CMD ["start.sh"]

1.start.sh
start.sh脚本中,您可以使用条件逻辑根据环境变量或任何其他条件来确定是以root用户身份运行还是以非root用户身份运行:

#!/bin/bash

if [ "$RUN_AS_ROOT" = "true" ]; then
    exec your_main_process_as_root
else
    exec gosu non_root_user your_main_process_as_non_root
fi

确保将non_root_user替换为您想要使用的实际非root用户。
1.Docker Compose
docker-compose.yml中,您可以指定一个环境变量来控制是否以root或非root身份运行:

version: '3'

services:
  your_service:
    image: your_image
    environment:
      - RUN_AS_ROOT=true
    # ...

这样,当您通过docker-compose启动容器时,它将在RUN_AS_ROOT环境变量设置为true的情况下运行,而您的start.sh脚本将以root身份执行主进程。
如果您想以非root用户的身份运行它,您可以简单地省略docker-compose.yml中的environment部分,默认行为将是以非root用户的身份运行。

相关问题