Docker中使用gosu的方法详解

 更新时间:2025年10月10日 10:56:53   作者:雲帝  
在Docker镜像中启动服务时,我们通常不希望以root身份运行主进程,sudogosu是一个非常轻量的工具,功能类似sudo,但不会产生额外进程,非常适合在Docker容器中用来切换用户,本文给大家介绍Docker中使用gosu的方法,感兴趣的朋友一起看看吧

Docker中使用gosu

为什么要用 gosu?

在 Docker 镜像中启动服务时,我们通常不希望以 root 身份运行主进程。

问题

  • 构建镜像时通常需要 root 权限;
  • 启动时希望进程使用普通用户运行;
  • 容器中使用 sudo 会产生额外的中间进程,导致信号转发不正常;
  • 最终可能出现僵尸进程、容器无法优雅退出等问题。

gosu 是一个非常轻量的工具,功能类似 sudo,但不会产生额外进程,非常适合在 Docker 容器中用来切换用户。

注意事项

  1. 创建专用普通用户,不要直接使用 root。
  2. 在 entrypoint 中使用 gosu 切换用户,不要用 sudo。
  3. 使用 exec 启动主进程,保证 PID=1 是应用本身。
  4. 正确接收 SIGTERM 信号,避免僵尸进程。
  5. 不要在 Docker 中滥用 sudo

sudo vs gosu:真实对比

使用 gosu

docker run --rm gosu/alpine gosu root ps aux

输出:

PID   USER     TIME  COMMAND
1     root     0:00  ps aux

  • ps 命令的 PID 是 1,容器内只有一个进程。
  • 这样当宿主机发送 SIGTERM 信号时,应用能直接接收到。

使用 sudo

docker run --rm ubuntu:trusty sudo ps aux

输出:

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0  46012  1772 ?        Rs   12:05   0:00 sudo ps aux
root          6  0.0  0.0  15568  1140 ?        R    12:05   0:00 ps aux

  • 容器内出现两个进程,PID=1 被 sudo 占用。
  • 应用进程的 PID 不为 1,无法直接接收信号。
  • 当执行 docker stop 时,信号发送给的是 sudo,而不是应用进程,可能导致应用残留为僵尸进程。

对比

项目gosusudo
进程数12
PID=1应用进程sudo
信号转发正常不正常
僵尸进程风险
适合容器使用

Dockerfile 安装 gosu

在 Dockerfile 中添加如下步骤即可:

FROM ubuntu:22.04
# 安装 gosu
RUN apt-get update && apt-get install -y gosu curl ca-certificates && rm -rf /var/lib/apt/lists/*
# 创建普通用户
RUN groupadd -r tempuser && useradd -r -g tempuser tempuser
# 拷贝入口脚本
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
# 验证 gosu 是否工作
RUN gosu nobody true
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

entrypoint.sh 的写法

entrypoint.sh 是容器启动脚本。

#!/usr/bin/env bash
set -e
# 使用 gosu 切换用户身份
if [ "$1" = "start-app" ]; then
    echo "Running application as tempuser..."
    exec gosu tempuser /app/my_server
fi
# 如果有其他命令,直接执行
exec "$@"

注意:exec 会让当前 shell 被新进程取代,保证应用进程的 PID=1。

构建 & 运行容器

docker build -t myapp .
docker run --rm -p 8080:8080 myapp start-app

容器内:

  • /app/my_server 的 PID = 1
  • 收到 docker stop 的信号时,能正确退出
  • 不会残留 sudo 或 shell 僵尸进程

信号量与僵尸进程问题

容器启动时 PID=1 的进程非常特殊,它负责接收来自宿主机的信号(例如 SIGTERMSIGINT)。

  • 如果 PID=1 是 sudo,信号不会传给应用;
  • 如果 PID=1 是应用进程本身,就能优雅退出;
  • 使用 exec + gosu 可以保证 PID=1 是你的应用;
  • 避免使用 shell 包一层后 & 运行后台进程的错误做法。

常见问题

问题原因解决方法
容器退出时残留僵尸进程PID=1 不是应用进程使用 exec + gosu
docker stop 不生效信号被 sudo 拦截不使用 sudo,PID=1 改为应用
gosu 报权限错误二进制无执行权限chmod +x /usr/local/bin/gosu
切换用户失败用户不存在使用 useradd 创建对应用户

参考资料

到此这篇关于Docker中使用gosu的文章就介绍到这了,更多相关docker使用gosu内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker容器配置Nginx实例分享

    Docker容器配置Nginx实例分享

    这篇文章主要介绍了Docker容器配置Nginx实例分享的相关资料,需要的朋友可以参考下
    2016-10-10
  • Docker容器实战之镜像仓库

    Docker容器实战之镜像仓库

    这篇文章主要介绍了Docker容器实战之镜像仓库,文章通过Docker Hub为例,讲解关于镜像仓库的使用,需要的小伙伴可以参考一下
    2022-05-05
  • docker 挂载MySQL实现数据持久化的实现

    docker 挂载MySQL实现数据持久化的实现

    本文主要介绍了docker 挂载MySQL实现数据持久化的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Docker安装阿里云服务器和在虚拟机安装遇到的坑(问题小结)

    Docker安装阿里云服务器和在虚拟机安装遇到的坑(问题小结)

    这篇文章主要介绍了Docker安装阿里云服务器和在虚拟机安装遇到的坑,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 备份Docker容器中的PostgreSQL数据的图文实操教程

    备份Docker容器中的PostgreSQL数据的图文实操教程

    现在docker容器很方便,可以一键部署项目,但是方便部署的同时,也给运维带来了麻烦,docker中的pgsql数据,如何进行备份呢,本文小编给大家就介绍了备份Docker容器中的PostgreSQL数据的图文实操教程,需要的朋友可以参考下
    2024-09-09
  • 解决'nacos默认secret.key配置不当权限绕过漏洞'的问题

    解决'nacos默认secret.key配置不当权限绕过漏洞'的问题

    这篇文章主要介绍了解决“nacos默认secret.key配置不当权限绕过漏洞“的问题,解决这个问题需要对这个key的默认值进行修改,建议不要使用明文,可以用base64,key的长度要32位以上,下面介绍一下在两种环境下的修改方法,感兴趣的朋友一起看看吧
    2024-01-01
  • docker部署jdk21的镜像全过程

    docker部署jdk21的镜像全过程

    这篇文章主要给大家介绍了关于docker部署jdk21的镜像的相关资料,镜像中包含了应用程序所需要的运行环境,函数库,配置,以及应用本身等各种文件,这些文件分层打包而成,需要的朋友可以参考下
    2024-02-02
  • 用Docker swarm快速部署Nebula Graph集群的教程

    用Docker swarm快速部署Nebula Graph集群的教程

    这篇文章主要介绍了用Docker swarm快速部署Nebula Graph集群的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Docker快速安装Zookeeper的详细教程

    Docker快速安装Zookeeper的详细教程

    这篇文章主要介绍了Docker快速安装Zookeeper,不清楚如何搭建docker的朋友可以参考下本文
    2021-06-06
  • Docker搭建Elasticsearch集群和Kibana全过程

    Docker搭建Elasticsearch集群和Kibana全过程

    这篇文章主要介绍了Docker搭建Elasticsearch集群和Kibana全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论