如何在NodeJS应用Docker容器中将curl和libcurl升级至8.4.0
在容器中升级curl到8.4.0版本
问题背景
你使用多阶段构建的Dockerfile构建Node.js应用,build阶段基于node:14-alpine,最终镜像基于app-base/docker-base。尝试安装最新版curl后,进入最终容器执行curl --version得到以下输出:
root@my-app:/var/www/app# curl --version curl 7.74.0 (x86_64-pc-linux-gnu) libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.11 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3 Release-Date: 2020-12-09 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
当前curl版本为7.74.0,需要升级至8.4.0。
你的Dockerfile内容如下:
FROM node:14-alpine AS build # Install necessary packages using the 'apk' package manager RUN apk update && \ apk add --no-cache wget build-base openssl-dev # Install a more recent version of curl RUN apk add --no-cache curl # Set the source folder ARG SOURCE_FOLDER="./" ARG BUILD_VERSION ARG NPM_TOKEN # Create app directory WORKDIR /var/www/app # Bundle app source COPY ${SOURCE_FOLDER} . # Run the build.sh script RUN chmod +x build.sh && ./build.sh RUN NODE_OPTIONS=--max_old_space_size=4096 lsc build site --output-hashing all --buildVersion=$BUILD_VERSION && \ rm -f .npmrc FROM app-base/docker-base COPY --from=build /var/www/app/dist/ngx-rsc-app /var/www/app
问题分析
从curl --version的输出x86_64-pc-linux-gnu可以判断,你进入的最终容器基于Debian/Ubuntu类发行版(而非build阶段的Alpine),该基础镜像的默认软件源中curl版本停留在7.74.0,因此直接用系统包管理器无法获取8.4.0版本。
解决方案
方法一:添加curl官方源安装指定版本(推荐)
如果app-base/docker-base是Debian 11+或Ubuntu 20.04+,可以通过添加curl官方软件源来安装8.4.0版本:
修改Dockerfile的最终阶段:
FROM app-base/docker-base # 安装依赖并配置curl官方源 RUN apt-get update && \ apt-get install -y --no-install-recommends gnupg2 ca-certificates && \ # 导入curl官方GPG密钥 curl -fsSL https://curl.se/ca/curl-release.crt | gpg --dearmor -o /usr/share/keyrings/curl-archive-keyring.gpg && \ # 添加curl官方源 echo "deb [signed-by=/usr/share/keyrings/curl-archive-keyring.gpg] https://curl.se/deb/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/curl.list && \ # 更新源并安装curl 8.4.0 apt-get update && \ apt-get install -y --no-install-recommends curl=8.4.0-1~$(lsb_release -sc) && \ # 清理缓存减少镜像体积 apt-get clean && \ rm -rf /var/lib/apt/lists/* COPY --from=build /var/www/app/dist/ngx-rsc-app /var/www/app
方法二:从源码编译curl 8.4.0
如果无法添加外部软件源,可选择从源码编译安装:
修改Dockerfile的最终阶段:
FROM app-base/docker-base # 安装编译依赖 RUN apt-get update && \ apt-get install -y --no-install-recommends build-essential wget openssl libssl-dev zlib1g-dev libbrotli-dev libidn2-dev libpsl-dev libssh2-1-dev libnghttp2-dev librtmp-dev && \ # 下载curl 8.4.0源码并编译 wget https://curl.se/download/curl-8.4.0.tar.gz && \ tar -xzf curl-8.4.0.tar.gz && \ cd curl-8.4.0 && \ ./configure --prefix=/usr --with-openssl --with-brotli --with-zlib --with-libidn2 --with-libpsl --with-libssh2 --with-nghttp2 --with-librtmp && \ make -j$(nproc) && \ make install && \ # 清理编译文件和无用依赖 cd .. && \ rm -rf curl-8.4.0 curl-8.4.0.tar.gz && \ apt-get purge -y build-essential wget && \ apt-get autoremove -y && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* COPY --from=build /var/www/app/dist/ngx-rsc-app /var/www/app
补充:若需在build阶段的Alpine容器升级curl
如果是build阶段的Alpine容器需要新版curl,由于node:14-alpine对应Alpine 3.14,官方稳定源中curl版本为7.74.0,可临时使用Alpine Edge源安装:
# 在build阶段替换原curl安装命令 RUN apk add --no-cache curl --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
注意:Edge源为开发分支,包版本更新但可能存在稳定性风险,适合测试环境。
内容的提问来源于stack exchange,提问作者merilstack
相关产品推荐
相关产品推荐

