yum install -y 是什么意思_为什么你应该在docker 中使用gosu?
為什么要使用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 trueOlder 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.yamlexec 到容器執(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何减少路由器延迟如何减低路由器延迟
- 下一篇: rostcm6情感分析案例分析_卷积情感