【问题标题】:Installing git overwrites curl library in Docker安装 git 会覆盖 Docker 中的 curl 库
【发布时间】:2021-10-14 19:35:02
【问题描述】:

我正在尝试使用 git-ftp 创建 Docker 映像,以便可以部署到 sftp 服务器。

git-ftp 需要 gitcurllibssh2 编译,通常不包括在内,所以我从 curl 开发者那里找到了一个带有 sftp 支持的 Docker 映像:

% docker run --rm curlimages/curl:7.79.1 --version

curl 7.79.1-DEV (x86_64-pc-linux-musl) libcurl/7.79.1-DEV OpenSSL/1.1.1l zlib/1.2.11 brotli/1.0.9 libssh2/1.9.0 nghttp2/1.43.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s 
rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: alt-svc AsynchDNS brotli HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM 
NTLM_WB SSL TLS-SRP UnixSockets

但是,在我的 Dockerfile 中使用它作为基础镜像,在安装 git 之后我失去了 sftp 支持:

FROM curlimages/curl:7.79.1

USER root
RUN apk add --no-cache bash git
RUN git clone https://github.com/git-ftp/git-ftp.git

USER curl_user

WORKDIR /git-ftp

ENTRYPOINT ./git-ftp push --user $FTP_USER --passwd $FTP_PASSWORD $FTP_HOST
% docker run --env FTP_USER=user --env FTP_PASSWORD=password --env FTP_HOST=sftp://localhost:22 git-ftp
fatal: Protocol 'sftp' not supported by curl, exiting...

ENTRYPOINT 作为curl --version 运行给了我以下信息:

curl 7.79.1-DEV (x86_64-pc-linux-musl) libcurl/7.79.1 OpenSSL/1.1.1l zlib/1.2.11 brotli/1.0.9 nghttp2/1.43.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: alt-svc AsynchDNS brotli HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM 
NTLM_WB SSL TLS-SRP UnixSockets
WARNING: curl and libcurl versions do not match. Functionality may be affected.

所以,突然间,在安装 git 后,我失去了 sftp 支持,这是我使用此基础映像的唯一原因。

发生了什么事?我该如何解决这个问题?

【问题讨论】:

    标签: git docker curl dockerfile sftp


    【解决方案1】:

    Git 需要 libcurl 来支持 HTTP 和 HTTPS。因为不支持 HTTPS 的 Git 用处不大,所以 Git 的大部分发行包都依赖于 libcurl 的发行包。

    在您的情况下可能发生的情况是,当您安装 Git 时,它的依赖项 libcurl 也会从发行版包中安装。自定义 libcurl 要么安装在没有合适软件包的正常位置,因此被覆盖,要么安装在库搜索路径中的某个位置,并且由于首选发行版而被忽略。

    您应该在安装 Git 之前和之后运行 ldd $(which curl) 并找出 libcurl 的自定义和发行版的位置。如果映像正在将 libcurl 安装到 /usr/lib 下的某个位置,那么它就坏了:该位置是为包管理器保留的,它需要构建和安装一个具有自定义版本的普通系统包以避免被覆盖。否则,您可以修改/etc/ld.so.conf 以调整库的搜索路径,或使用LD_LIBRARY_PATH 环境变量在每个程序的基础上这样做。

    【讨论】:

    • 而且,请记住,由于这一切都是在 docker 映像中完成的,因此用户总是可以在事后重新洗牌。
    • 嗯,它是安装在/usr/lib下的,所以当git安装它会覆盖基础镜像库...有什么方法可以安装git i> 通过 apk 而不安装依赖项?
    • 大多数包管理器不允许您在没有所需依赖项的情况下安装,但我无法与 apk 交谈。你真的应该告诉图像的维护者修复图像。或者,您可以只使用与 libssh2 链接的 Debian 映像。
    【解决方案2】:

    我的解决方案是在安装git 之后使用libssh2 编译curl。构建映像需要更长的时间,但它比使用 Debian 更轻。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多