首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Docker中安装git覆盖curl库

在Docker中安装git覆盖curl库
EN

Stack Overflow用户
提问于 2021-10-14 19:35:02
回答 2查看 115关注 0票数 1

我试图用git创建一个Docker映像,这样我就可以部署到sftp服务器上。

git-ftp需要用libssh2编译的git和curl,这通常不包括在内,所以我从sftp支持的curl中找到了一个Docker映像:

代码语言:javascript
复制
% 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支持:

代码语言:javascript
复制
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
代码语言:javascript
复制
% 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运行将为我提供以下信息:

代码语言:javascript
复制
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支持,这是我使用这个基本映像的唯一原因。

到底怎么回事?我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-17 16:15:59

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

票数 0
EN

Stack Overflow用户

发布于 2021-10-15 01:45:16

Git需要libcurl来支持HTTP和HTTPS。因为没有HTTPS支持的Git并不是很有用,所以Git的大多数发行版包都依赖于libcurl的发行版包。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69576415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档