如何在Docker容器中安装和使用gosu工具

如何在Docker容器中安装和使用gosu工具

gosu Simple Go-based setuid+setgid+setgroups+exec gosu 项目地址: https://gitcode.com/gh_mirrors/go/gosu

什么是gosu

gosu是一个简单的Go语言编写的工具,主要用于在Docker容器中以特定用户身份运行命令。它解决了传统su和sudo命令在容器环境中使用时的一些问题,如环境变量处理和信号传递等。

为什么需要gosu

在Docker容器中,我们经常需要以非root用户运行应用程序以提高安全性。gosu提供了一种简单可靠的方式来实现这一点,相比传统的su和sudo命令,gosu具有以下优势:

  1. 不会产生额外的进程(如终端会话)
  2. 正确处理信号传递
  3. 保持环境变量不变
  4. 更简单的命令行语法

安装方法

在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的最佳实践

  1. 在Dockerfile中安装gosu后,建议立即测试它是否能正常工作(如示例中的gosu nobody true
  2. 在容器启动脚本中使用gosu切换用户,而不是在Dockerfile中
  3. 为应用程序创建专用用户,而不是使用现有的系统用户
  4. 确保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 gosu 项目地址: https://gitcode.com/gh_mirrors/go/gosu

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/fe886b97b3d0 “CSDN-中文IT社区-600万.rar” 这个文件名称表明它与CSDN(中国软件开发者网络)有关,且包含600万份资源。CSDN作为中国最大的IT技术交流平台,覆盖了编程语言、软件开发、网络安全、大数据、云计算等多个领域的知识资讯。该压缩包可能包含用户数据、文章、讨论话题或学习资料等。其内容可能极为丰富,涵盖大量用户生成内容,如博客文章、论坛帖子、问答记录等,对于研究IT行业趋势、开发者行为技术热点等具有重要价值。尽管目前没有具体内容,但推测可能涉及“编程”“开发”“社区数据”“技术文章”“学习资源”等标签。 从文件名称来看,压缩包的内容可能包括以下几类:一是用户数据,如注册信息、活动记录、帖子评论等,可用于分析用户行为社区活跃度;二是技术文章博客,涵盖众多技术专家分享的教程、解决方案经验;三是源代码项目,供其他开发者学习参考;四是论坛讨论,反映开发者关注的技术问题热点;五是资源下载,如教程素材、工具软件、开发库等;六是会议活动记录,包括报告、演讲稿视频;七是学习路径课程,帮助开发者提升技能;八是排行榜奖项,体现社区的认可度影响力。 “CSDN-中文IT社区-600万.rar” 压缩包可能是一个极具价值的IT知识宝库,涵盖从基础编程到高级技术实践的广泛主题,反映了中国IT社区的发展动态。对于IT从业者、研究人员以及编程爱好者来说,它是一个极具价值的学习研究资源,能够帮助人们洞察开发者需求、技术趋势社区变化。
### Docker 环境下离线部署 Redmine 方法 #### 准备工作 为了在离线环境中成功安装并运行 Redmine,需提前准备必要的文件环境设置。 - **下载所需镜像**:确保事先在网络连接良好的机器上获取所需的 Docker 镜像,并将其保存为 .tar 文件以便传输到目标主机。对于 Redmine 来说,通常涉及 `redmine` 其依赖数据库(如 MySQL 或 PostgreSQL)的镜像[^1]。 - **转移镜像至目标机**:通过 USB 存储设备或其他物理介质将上述 tar 包转移到无网络连接的目标计算机上。之后利用命令加载这些镜像: ```bash docker load -i path_to_your_image.tar ``` #### 创建数据卷用于持久化存储 创建专门的数据卷来保持应用数据的安全性可移植性是非常重要的一步操作,在此过程中可以执行如下指令建立相应的目录结构作为后续挂载点使用: ```bash mkdir -p /data/docker/redmine/mysql mkdir -p /data/docker/redmine/redmine/files ``` #### 编写 Compose 文件定义服务架构 编写一个名为 `docker-compose.yml` 的 YAML 格式的配置文档描述整个系统的构成关系以及各组件之间的交互方式。这里给出一段简化版的例子供参考: ```yaml version: '3' services: db: image: mysql:5.7 volumes: - ./mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: redmine MYSQL_USER: redmine MYSQL_PASSWORD: example web: image: redmine:latest depends_on: - db ports: - "80:3000" volumes: - ./redmine/files:/usr/src/redmine/files environment: REDMINE_DB_MYSQL: db REDMINE_DB_USERNAME: redmine REDMINE_DB_PASSWORD: example REDMINE_DB_NAME: redmine ``` #### 启动服务集群 完成以上准备工作后就可以调用 docker-compose 工具启动所有已定义的服务实例了。由于当前处于断开互联网的状态所以务必确认之前已经正确导入过相关联的镜像资源;另外如果遇到任何权限方面的问题记得赋予足够的访问许可给对应路径下的文件夹及其子项。 ```bash cd /path/to/your/project/folder/ docker-compose up -d ``` #### 安装插件扩展功能 针对特定需求可能还需要额外引入第三方模块增强平台的功能特性。此时应该先拷贝好完整的压缩包形式分发版本放置于指定位置再按照官方说明实施具体步骤。例如要添加 Lightbox2 插件,则可以在本地预先克隆仓库内容随后复制到相应的位置并通过进入容器内部的方式激活它: ```bash cp -r ~/downloads/redmine_lightbox2 /data/docker/redmine/redmine/plugins/ docker exec -it $(docker ps | grep _web_ | awk '{print $1}') \ gosu redmine bundle install && gosu redmine rake redmine:plugins:migrate RAILS_ENV=production ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔岱怀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值