更改 Discourse Docker 安装的 git 可执行文件路径

大家好,

感谢提供这么棒的论坛应用!作为 Docker 和 Discourse 的新手,如果这是个很基础的问题,还请见谅。系统:Ubuntu LTS 20.04

简短版:有没有办法使用安装在 /usr/bin 以外的 git?

详细版:我手动在 /usr/local 安装了新版 git(2.31.1),以解决 libgnutls 链接问题及 gnutls_handshake() 错误,并将 /usr/local/bin 添加到了 PATH 中。在启动脚本中,我在 run_commandcd /pups/ 之前添加了 echo $PATH && which git。运行 ./launcher rebuild app 后输出如下:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin/:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
/usr/bin/git

这是否意味着后续所有的 git 操作实际上都在使用 /usr/bin/git?如果是这样,我原本期望 git 会被定位到 /usr/local/bin

事实上,我不记得曾通过 apt-get 或其他方式在 /usr 下安装过 git。我认为这与 Docker 的工作方式有关,请问有办法自定义吗?

再次感谢!
minye

大家好,

如果有人恰好看到这条消息,我通过基于 Discourse 官方基础镜像构建一个名为 newgit 的新镜像,并修改 launcher 中的 image 变量来安装 Discourse,成功实现了这一目标。

Dockerfile 中的主要指令如下。所有依赖项(如 perl、gcc 等)均由基础镜像处理。

# 安装一个不依赖 gnutls 的 git
RUN cd / \u0026\u0026 \\\
    vcurl=7.68.0 \u0026\u0026 wget http://dl.uxnr.de/mirror/curl/curl-$vcurl.tar.gz \u0026\u0026 \\\
    vssl=1.1.1f \u0026\u0026 wget http://www.openssl.org/source/openssl-$vssl.tar.gz \u0026\u0026 \\\
    vgit=2.31.1 \u0026\u0026 wget http://mirrors.edge.kernel.org/pub/software/scm/git/git-$vgit.tar.gz \u0026\u0026 \\\
    tar -zxf curl-$vcurl.tar.gz \u0026\u0026 tar -zxf openssl-$vssl.tar.gz \u0026\u0026 \\\
    tar -zxf git-$vgit.tar.gz \u0026\u0026 \\\
    cd openssl-$vssl \u0026\u0026 ./config --prefix=/usr/local \u0026\u0026 make \u0026\u0026 make install \u0026\u0026 cd .. \u0026\u0026 \\\
    cd curl-$vcurl \u0026\u0026 ./configure --with-ssl=/usr/local --prefix=/usr/local --without-gnutls --disable-ldap --without-librtmp \u0026\u0026 make \u0026\u0026 make install \u0026\u0026 cd .. \u0026\u0026 \\\
    cd git-$vgit \u0026\u0026 make configure \u0026\u0026 ./configure --prefix=/usr/local --with-openssl=/usr/local --with-curl=/usr/local \u0026\u0026 make \u0026\u0026 make install \u0026\u0026 cd ../ \u0026\u0026 \\\
    rm -rf /curl-${vurl}* /openssl-${vssl}* /git-${vgit}*
# 检查 git 安装
RUN which git \u0026\u0026 git version \u0026\u0026 (ldd -v /usr/local/libexec/git-core/git-remote-https | grep gnutls) || echo "Git is not linked to libgnutls"

最终生成 /usr/local/bin/git

我清楚这可能是一种权宜之计,并不被开发团队推荐。我在此分享仅作为 Docker 初学者的参考,以防有人有类似需求。