如何在Docker容器中安装和使用gosu工具
gosu Simple Go-based setuid+setgid+setgroups+exec 项目地址: https://gitcode.com/gh_mirrors/go/gosu
什么是gosu
gosu是一个简单的Go语言编写的工具,主要用于在Docker容器中以特定用户身份运行命令。它解决了传统su和sudo命令在容器环境中使用时的一些问题,如环境变量处理和信号传递等。
为什么需要gosu
在Docker容器中,我们经常需要以非root用户运行应用程序以提高安全性。gosu提供了一种简单可靠的方式来实现这一点,相比传统的su和sudo命令,gosu具有以下优势:
- 不会产生额外的进程(如终端会话)
- 正确处理信号传递
- 保持环境变量不变
- 更简单的命令行语法
安装方法
在Debian/Ubuntu基础镜像中安装
对于基于Debian的镜像(如Debian Stretch或更新版本),最简单的方法是使用系统包管理器:
RUN set -eux; \
apt-get update; \
apt-get install -y gosu; \
rm -rf /var/lib/apt/lists/*; \
gosu nobody true
如果需要安装特定版本的gosu,可以使用以下方法:
ENV GOSU_VERSION 1.17
RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends ca-certificates gnupg wget; \
rm -rf /var/lib/apt/lists/*; \
\
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
wget -O /usr/local/bin/gosu "下载地址/gosu-$dpkgArch"; \
wget -O /usr/local/bin/gosu.asc "下载地址/gosu-$dpkgArch.asc"; \
\
export 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; \
gpgconf --kill all; \
rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
\
apt-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; \
gosu --version; \
gosu nobody true
在Alpine Linux基础镜像中安装
对于Alpine Linux镜像(3.7或更新版本):
ENV GOSU_VERSION 1.17
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 "下载地址/gosu-$dpkgArch"; \
wget -O /usr/local/bin/gosu.asc "下载地址/gosu-$dpkgArch.asc"; \
\
export 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; \
gpgconf --kill all; \
rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
\
apk del --no-network .gosu-deps; \
\
chmod +x /usr/local/bin/gosu; \
gosu --version; \
gosu nobody true
在RPM基础镜像中安装(CentOS/Oracle Linux等)
对于基于RPM的发行版:
ENV GOSU_VERSION 1.17
RUN set -eux; \
rpmArch="$(rpm --query --queryformat='%{ARCH}' rpm)"; \
case "$rpmArch" in \
aarch64) dpkgArch='arm64' ;; \
armv[67]*) dpkgArch='armhf' ;; \
i[3456]86) dpkgArch='i386' ;; \
ppc64le) dpkgArch='ppc64el' ;; \
riscv64 | s390x) dpkgArch="$rpmArch" ;; \
x86_64) dpkgArch='amd64' ;; \
*) echo >&2 "error: unknown/unsupported architecture '$rpmArch'"; exit 1 ;; \
esac; \
wget -O /usr/local/bin/gosu "下载地址/gosu-$dpkgArch"; \
wget -O /usr/local/bin/gosu.asc "下载地址/gosu-$dpkgArch.asc"; \
\
export 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; \
gpgconf --kill all; \
rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
\
chmod +x /usr/local/bin/gosu; \
gosu --version; \
gosu nobody true
快速安装方法
如果不想手动安装,可以直接从官方镜像复制gosu二进制文件:
COPY --from=官方镜像 /gosu /usr/local/bin/
使用gosu的最佳实践
- 在Dockerfile中安装gosu后,建议立即测试它是否能正常工作(如示例中的
gosu nobody true
) - 在容器启动脚本中使用gosu切换用户,而不是在Dockerfile中
- 为应用程序创建专用用户,而不是使用现有的系统用户
- 确保gosu二进制文件具有可执行权限
常见问题解答
Q: 为什么需要验证gosu的签名?
A: 验证签名可以确保下载的gosu二进制文件确实来自官方发布,没有被篡改,这是安全最佳实践。
Q: 如何选择gosu的版本?
A: 通常建议使用最新稳定版本,可以在安装时设置GOSU_VERSION
环境变量来指定版本号。
Q: 为什么在安装后要运行gosu nobody true
?
A: 这是一个简单的测试,验证gosu是否能够正常工作。nobody
是一个几乎存在于所有Unix系统上的用户,这个命令尝试以nobody用户身份运行true
命令,如果成功则说明gosu安装正确。
通过本文介绍的方法,您可以在各种基础镜像中安全地安装和使用gosu工具,从而更好地管理Docker容器中的用户权限问题。
gosu Simple Go-based setuid+setgid+setgroups+exec 项目地址: https://gitcode.com/gh_mirrors/go/gosu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考