Docker中安装git覆盖curl库丢失sftp支持的问题如何解决?
问题原因
curlimages/curl:7.79.1 镜像中的 curl 是官方自定义编译的版本,集成了 libssh2 支持所以可以使用 sftp 协议,这个自定义版本没有通过 Alpine 的 apk 包管理器安装。
你执行 apk add git 时,git 依赖 libcurl 库,apk 会自动从 Alpine 官方源拉取标准版本的 libcurl 和 curl 包,直接覆盖了镜像中原有的自定义编译的 curl 相关文件:
- 标准 Alpine 源的 libcurl 默认没有编译
libssh2模块,因此丢失 sftp 支持 - 原有自定义 curl 二进制和新安装的标准 libcurl 版本不匹配,就出现了你看到的版本不匹配警告
修复方案
两种常用修复方式任选其一即可:
方案1:安装git时禁止apk升级已存在的libcurl
执行 apk 安装命令时添加 --no-upgrade 参数,指定不更新系统中已存在的 libcurl,避免覆盖自定义版本:
FROM curlimages/curl:7.79.1 USER root # 关键参数:--no-upgrade libcurl 阻止apk更新已有的libcurl RUN apk add --no-cache --no-upgrade bash git libssh2 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
额外添加 libssh2 是确保依赖库存在,避免自定义 curl 运行时找不到库文件。
方案2:先安装git再编译安装带sftp支持的curl
如果方案1因为依赖冲突无法使用,可以换用 Alpine 基础镜像,先装 git,再自行编译带 libssh2 的 curl,虽然步骤多一点但稳定性更高:
FROM alpine:3.14 RUN apk add --no-cache bash git build-base openssl-dev zlib-dev brotli-dev libssh2-dev nghttp2-dev # 编译安装对应版本的curl,开启sftp支持 RUN curl -OL https://curl.se/download/curl-7.79.1.tar.gz && \ tar -xzf curl-7.79.1.tar.gz && cd curl-7.79.1 && \ ./configure --with-libssh2 --with-openssl --with-zlib --with-brotli --with-nghttp2 && \ make && make install && cd .. && rm -rf curl-7.79.1* && \ apk del build-base # 安装git-ftp RUN git clone https://github.com/git-ftp/git-ftp.git WORKDIR /git-ftp ENTRYPOINT ./git-ftp push --user $FTP_USER --passwd $FTP_PASSWORD $FTP_HOST
内容的提问来源于stack exchange,提问作者gabrieljcs
相关产品推荐
相关产品推荐

