日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

yum install -y 是什么意思_为什么你应该在docker 中使用gosu?

發(fā)布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 yum install -y 是什么意思_为什么你应该在docker 中使用gosu? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為什么要使用gosu?

Docker容器中運行的進(jìn)程,如果以root身份運行話會有安全隱患,該進(jìn)程擁有容器內(nèi)的全部權(quán)限,更可怕的是如果有數(shù)據(jù)卷映射到宿主機,那么通過該容器就能操作宿主機的文件夾了,一旦該容器的進(jìn)程有漏洞被外部利用后果是很嚴(yán)重的。

因此,容器內(nèi)使用非root賬號運行進(jìn)程才是安全的方式,這也是我們在制作鏡像時要注意的地方。

而我們今天講到的gosu 正是解決使用非root用戶運行業(yè)務(wù)進(jìn)程的一種最佳實踐方法。

su和sudo具有非常奇怪且經(jīng)常令人討厭的TTY和信號轉(zhuǎn)發(fā)行為的問題。su和sudo的設(shè)置和使用也有些復(fù)雜(特別是在sudo的情況下),雖然它們有很大的表達(dá)力,但是如果您所需要的只是“以特定用戶身份運行特定應(yīng)用程序”,那么它們將不再那么適合。

處理完用戶/組后,我們將切換到指定用戶,然后執(zhí)行指定的進(jìn)程,gosu本身不再駐留或完全不在進(jìn)程生命周期中。這避免了信號傳遞和TTY的所有問題。

概念總是晦澀的,讓我們通過一些示例來加深理解。

$ docker run -it --rm ubuntu:trusty su -c 'exec ps aux' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 46636 2688 ? Ss+ 02:22 0:00 su -c exec ps a root 6 0.0 0.0 15576 2220 ? Rs 02:22 0:00 ps aux $ docker run -it --rm ubuntu:trusty sudo ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 3.0 0.0 46020 3144 ? Ss+ 02:22 0:00 sudo ps aux root 7 0.0 0.0 15576 2172 ? R+ 02:22 0:00 ps aux $ docker run -it --rm -v $PWD/gosu-amd64:/usr/local/bin/gosu:ro ubuntu:trusty gosu root ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 7140 768 ? Rs+ 02:22 0:00 ps aux

安裝gosu

對于debian:

Debian 9 ("Debian Stretch") or newer:

RUN set -eux; apt-get update; apt-get install -y gosu; rm -rf /var/lib/apt/lists/*; # verify that the binary worksgosu nobody true

Older Debian releases (or newer gosu releases):

ENV GOSU_VERSION 1.12 RUN set -eux; # save list of currently installed packages for later so we can clean upsavedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends ca-certificates wget; if ! command -v gpg; then apt-get install -y --no-install-recommends gnupg2 dirmngr; elif gpg --version | grep -q '^gpg (GnuPG) 1.'; then # "This package provides support for HKPS keyservers." (GnuPG 1.x only)apt-get install -y --no-install-recommends gnupg-curl; fi; rm -rf /var/lib/apt/lists/*; dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; # verify the signatureexport GNUPGHOME="$(mktemp -d)"; gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; command -v gpgconf && gpgconf --kill all || :; rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; # clean up fetch dependenciesapt-mark auto '.*' > /dev/null; [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; chmod +x /usr/local/bin/gosu; # verify that the binary worksgosu --version; gosu nobody true

對于alpine(3.7+):

ENV GOSU_VERSION 1.12 RUN set -eux; apk add --no-cache --virtual .gosu-deps ca-certificates dpkg gnupg ; dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; # verify the signatureexport GNUPGHOME="$(mktemp -d)"; gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; command -v gpgconf && gpgconf --kill all || :; rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; # clean up fetch dependenciesapk del --no-network .gosu-deps; chmod +x /usr/local/bin/gosu; # verify that the binary worksgosu --version; gosu nobody true

如何使用gosu?

一般是在entrypoint.sh使用。

例如,Postgres Official Image使用以下腳本作為其ENTRYPOINT:

#!/bin/bash set -eif [ "$1" = 'postgres' ]; thenchown -R postgres "$PGDATA"if [ -z "$(ls -A "$PGDATA")" ]; thengosu postgres initdbfiexec gosu postgres "$@" fiexec "$@"

關(guān)于 exec ,大家可以查閱我之前寫的文章,其作用主要是會將gosu postgres 后面命令運行的進(jìn)程替換entrypoint.sh 進(jìn)程作為1號進(jìn)程。并且運行該進(jìn)程的用戶為postgres,而不是root。

拿我們線上的一個容器來舉例:

entrypoint.sh為:

#! /bin/bash set -e chown -R xxxuser:xxxgroup /data/logs exec gosu xxxuser tini -- myprogram -config /etc/config.prod.yaml

exec 到容器執(zhí)行whoami:

sh-4.2# whoami root

可以看到整個容器當(dāng)前的用戶是root。

然后查看運行我們tini 和 myprogram進(jìn)程的用戶:

sh-4.2# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND xxxuser 1 0.0 0.0 4372 368 ? Ss 18:17 0:00 tini -- myprogram -config /etc/config.prod.yaml xxxuser 14 2.6 0.4 1015768 315868 ? Sl 18:17 1:20 myprogram -config /etc/config.prod.yaml

到了這里可能大家已經(jīng)非常清楚了。

至于tini,大家可以查閱我之前的文章。

總結(jié)

以上是生活随笔為你收集整理的yum install -y 是什么意思_为什么你应该在docker 中使用gosu?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。