最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker中使用gosu的方法詳解

 更新時間:2025年10月10日 10:56:53   作者:雲(yún)帝  
在Docker鏡像中啟動服務(wù)時,我們通常不希望以root身份運(yùn)行主進(jìn)程,sudogosu是一個非常輕量的工具,功能類似sudo,但不會產(chǎn)生額外進(jìn)程,非常適合在Docker容器中用來切換用戶,本文給大家介紹Docker中使用gosu的方法,感興趣的朋友一起看看吧

Docker中使用gosu

為什么要用 gosu?

在 Docker 鏡像中啟動服務(wù)時,我們通常不希望以 root 身份運(yùn)行主進(jìn)程。

問題

  • 構(gòu)建鏡像時通常需要 root 權(quán)限;
  • 啟動時希望進(jìn)程使用普通用戶運(yùn)行;
  • 容器中使用 sudo 會產(chǎn)生額外的中間進(jìn)程,導(dǎo)致信號轉(zhuǎn)發(fā)不正常;
  • 最終可能出現(xiàn)僵尸進(jìn)程、容器無法優(yōu)雅退出等問題。

gosu 是一個非常輕量的工具,功能類似 sudo,但不會產(chǎn)生額外進(jìn)程,非常適合在 Docker 容器中用來切換用戶。

注意事項

  1. 創(chuàng)建專用普通用戶,不要直接使用 root。
  2. 在 entrypoint 中使用 gosu 切換用戶,不要用 sudo。
  3. 使用 exec 啟動主進(jìn)程,保證 PID=1 是應(yīng)用本身。
  4. 正確接收 SIGTERM 信號,避免僵尸進(jìn)程。
  5. 不要在 Docker 中濫用 sudo。

sudo vs gosu:真實(shí)對比

使用 gosu

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

輸出:

PID   USER     TIME  COMMAND
1     root     0:00  ps aux

  • ps 命令的 PID 是 1,容器內(nèi)只有一個進(jìn)程。
  • 這樣當(dāng)宿主機(jī)發(fā)送 SIGTERM 信號時,應(yīng)用能直接接收到。

使用 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

  • 容器內(nèi)出現(xiàn)兩個進(jìn)程,PID=1 被 sudo 占用。
  • 應(yīng)用進(jìn)程的 PID 不為 1,無法直接接收信號。
  • 當(dāng)執(zhí)行 docker stop 時,信號發(fā)送給的是 sudo,而不是應(yīng)用進(jìn)程,可能導(dǎo)致應(yīng)用殘留為僵尸進(jìn)程。

對比

項目gosusudo
進(jìn)程數(shù)12
PID=1應(yīng)用進(jìn)程sudo
信號轉(zhuǎn)發(fā)正常不正常
僵尸進(jìn)程風(fēng)險
適合容器使用

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/*
# 創(chuàng)建普通用戶
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
# 驗(yàn)證 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
# 如果有其他命令,直接執(zhí)行
exec "$@"

注意:exec 會讓當(dāng)前 shell 被新進(jìn)程取代,保證應(yīng)用進(jìn)程的 PID=1。

構(gòu)建 & 運(yùn)行容器

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

容器內(nèi):

  • /app/my_server 的 PID = 1
  • 收到 docker stop 的信號時,能正確退出
  • 不會殘留 sudo 或 shell 僵尸進(jìn)程

信號量與僵尸進(jìn)程問題

容器啟動時 PID=1 的進(jìn)程非常特殊,它負(fù)責(zé)接收來自宿主機(jī)的信號(例如 SIGTERM、SIGINT)。

  • 如果 PID=1 是 sudo,信號不會傳給應(yīng)用;
  • 如果 PID=1 是應(yīng)用進(jìn)程本身,就能優(yōu)雅退出;
  • 使用 exec + gosu 可以保證 PID=1 是你的應(yīng)用;
  • 避免使用 shell 包一層后 & 運(yùn)行后臺進(jìn)程的錯誤做法。

常見問題

問題原因解決方法
容器退出時殘留僵尸進(jìn)程PID=1 不是應(yīng)用進(jìn)程使用 exec + gosu
docker stop 不生效信號被 sudo 攔截不使用 sudo,PID=1 改為應(yīng)用
gosu 報權(quán)限錯誤二進(jìn)制無執(zhí)行權(quán)限chmod +x /usr/local/bin/gosu
切換用戶失敗用戶不存在使用 useradd 創(chuàng)建對應(yīng)用戶

參考資料

到此這篇關(guān)于Docker中使用gosu的文章就介紹到這了,更多相關(guān)docker使用gosu內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker容器生命周期相關(guān)命令及實(shí)踐詳解

    Docker容器生命周期相關(guān)命令及實(shí)踐詳解

    Docker容器生命周期管理是Docker平臺中的一項關(guān)鍵功能,它涉及對容器的創(chuàng)建、運(yùn)行、監(jiān)控以及銷毀等各個階段的操作,這篇文章主要介紹了Docker容器生命周期相關(guān)命令及實(shí)踐詳解的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • docker bashrc文件的合理配置方案詳解

    docker bashrc文件的合理配置方案詳解

    本文給大家詳細(xì)介紹docker bashrc文件的合理配置方案詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-10-10
  • win7環(huán)境下Docker快速構(gòu)建及阿里云容器加速配置詳解

    win7環(huán)境下Docker快速構(gòu)建及阿里云容器加速配置詳解

    這篇文章主要介紹了win7環(huán)境下Docker快速構(gòu)建及阿里云容器加速配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 利用Dockerfile制作個人的鏡像文件詳細(xì)講解

    利用Dockerfile制作個人的鏡像文件詳細(xì)講解

    Docker是一個開源的應(yīng)用容器引擎,Dockerfile是用來構(gòu)建Docker鏡像的構(gòu)建文件,是由一系列命令和參數(shù)構(gòu)成的腳本,本文將給大家詳細(xì)介紹如何利用Dockerfile制作個人的鏡像文件,感興趣的同學(xué)可以借鑒參考
    2023-06-06
  • docker安裝drone的實(shí)現(xiàn)示例

    docker安裝drone的實(shí)現(xiàn)示例

    Drone是一款基于Docker的持續(xù)集成和持續(xù)部署平臺,可以幫助開發(fā)者自動化構(gòu)建、測試和部署應(yīng)用程序,本文主要介紹了docker安裝drone的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2023-12-12
  • 云原生Docker容器自定義DNS解析

    云原生Docker容器自定義DNS解析

    Docker沒有為每個容器專門定制鏡像,那么怎么自定義配置容器的DNS配置呢?這篇文章主要給大家介紹了關(guān)于云原生Docker容器自定義DNS的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Docker?Compose最常用命令(直接復(fù)制用)

    Docker?Compose最常用命令(直接復(fù)制用)

    Docker Compose是Docker官方提供的一個用于管理多個容器的工具,可以使用docker-compose.yml文件定義和運(yùn)行多容器應(yīng)用,這篇文章主要介紹了Docker?Compose最常用命令的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • docker部署nginx訪問宿主機(jī)服務(wù)并使用緩存的操作方法

    docker部署nginx訪問宿主機(jī)服務(wù)并使用緩存的操作方法

    這篇文章主要介紹了docker部署nginx訪問宿主機(jī)服務(wù)并使用緩存的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2024-04-04
  • 2026年Docker常用命令及示例代碼大全

    2026年Docker常用命令及示例代碼大全

    本文詳細(xì)介紹了Docker常用命令的使用方法,包括啟動、關(guān)閉、重啟Docker服務(wù),查看Docker狀態(tài)和版本,運(yùn)行和管理容器,管理鏡像,創(chuàng)建和刪除容器,操作,查看和管理網(wǎng)絡(luò),及DockerCompose的使用,文中提供了大量示例,方便用戶快速了解和掌握Docker的各項功能和命令
    2026-05-05
  • IDEA集成Docker實(shí)現(xiàn)一鍵部署全過程

    IDEA集成Docker實(shí)現(xiàn)一鍵部署全過程

    本文詳細(xì)介紹了如何在IntelliJ IDEA中集成Docker并實(shí)現(xiàn)一鍵部署代碼的步驟,包括安裝Docker、配置服務(wù)器、IDEA配置、添加Dockerfile、運(yùn)行配置以及一鍵部署
    2024-11-11

最新評論

胶州市| 南丹县| 珲春市| 开原市| 出国| 扶风县| 苏尼特右旗| 孟州市| 南京市| 青河县| 江西省| 宁远县| 阿克陶县| 宁陵县| 邯郸市| 安平县| 龙游县| 汝南县| 富裕县| SHOW| 湘西| 赤峰市| 福清市| 东乡县| 新郑市| 花垣县| 双桥区| 延安市| 昌吉市| 汤阴县| 武乡县| 巴青县| 江津市| 绥滨县| 噶尔县| 崇义县| 新乐市| 互助| 贺兰县| 咸阳市| 锦州市|