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

Docker中使用gosu的方法詳解

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

Docker中使用gosu

為什么要用 gosu?

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

問題

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

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

注意事項

  1. 創(chuàng)建專用普通用戶,不要直接使用 root。
  2. 在 entrypoint 中使用 gosu 切換用戶,不要用 sudo。
  3. 使用 exec 啟動主進程,保證 PID=1 是應(yīng)用本身。
  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,容器內(nèi)只有一個進程。
  • 這樣當(dāng)宿主機發(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)兩個進程,PID=1 被 sudo 占用。
  • 應(yīng)用進程的 PID 不為 1,無法直接接收信號。
  • 當(dāng)執(zhí)行 docker stop 時,信號發(fā)送給的是 sudo,而不是應(yīng)用進程,可能導(dǎo)致應(yīng)用殘留為僵尸進程。

對比

項目gosusudo
進程數(shù)12
PID=1應(yīng)用進程sudo
信號轉(zhuǎn)發(fā)正常不正常
僵尸進程風(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
# 驗證 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 被新進程取代,保證應(yīng)用進程的 PID=1。

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

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

容器內(nèi):

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

信號量與僵尸進程問題

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

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

常見問題

問題原因解決方法
容器退出時殘留僵尸進程PID=1 不是應(yīng)用進程使用 exec + gosu
docker stop 不生效信號被 sudo 攔截不使用 sudo,PID=1 改為應(yīng)用
gosu 報權(quá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)命令及實踐詳解

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

    Docker容器生命周期管理是Docker平臺中的一項關(guān)鍵功能,它涉及對容器的創(chuàng)建、運行、監(jiān)控以及銷毀等各個階段的操作,這篇文章主要介紹了Docker容器生命周期相關(guān)命令及實踐詳解的相關(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的實現(xiàn)示例

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

    Drone是一款基于Docker的持續(xù)集成和持續(xù)部署平臺,可以幫助開發(fā)者自動化構(gòu)建、測試和部署應(yīng)用程序,本文主要介紹了docker安裝drone的實現(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īng)用,這篇文章主要介紹了Docker?Compose最常用命令的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • docker部署nginx訪問宿主機服務(wù)并使用緩存的操作方法

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

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

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

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

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

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

最新評論

五大连池市| 邮箱| 婺源县| 志丹县| 巩义市| 新蔡县| 天镇县| 安塞县| 五河县| 客服| 荔波县| 高陵县| 三门峡市| 泸西县| 巴东县| 班戈县| 古交市| 望江县| 墨竹工卡县| 德阳市| 阿克苏市| 广宁县| 黔江区| 吐鲁番市| 繁峙县| 满城县| 呼伦贝尔市| 枣阳市| 青岛市| 哈尔滨市| 施甸县| 阿拉善盟| 东乌珠穆沁旗| 江山市| 泗阳县| 东乡族自治县| 磴口县| 潼南县| 荔波县| 宁河县| 南郑县|