Jenkins中Python Alpine Docker运行psycopg2报libresolv.so.2缺失
问题场景
- Jenkins CI/CD流水线使用
3.9.13-alpine3.16作为Python应用的基础镜像,应用部署目标为AWS Lambda,唯一特殊依赖是用于连接Postgres的aws-psycopg2 - 项目本地、Serverless部署到AWS Lambda后均运行正常,仅Jenkins流水线执行时抛出共享库加载错误
- 未使用Oracle相关组件,不属于已知的Oracle类
libresolv.so.2报错场景 - 已尝试在apk安装命令中添加多组系统依赖,均未修复问题;相同代码在Ubuntu 20.04、AWS Lambda原生运行时可正常运行,判定为Alpine环境缺失对应系统依赖
报错信息
16:24:55 ImportError: Error loading shared library libresolv.so.2: No such file or directory (needed by /usr/local/lib/python3.9/site-packages/psycopg2/../psycopg2_binary.libs/libgssapi_krb5-497db0c6.so.2.2)
现有Jenkinsfile配置
def testInstallStage = { stage('Install') { sh 'apk add python3-dev gcc libc-dev musl-dev openblas gfortran build-base postgresql-libs postgresql-dev libffi-dev cargo' sh 'pip install --upgrade pip && pip install poetry' sh 'poetry export --without-hashes --dev -f requirements.txt -o requirements.txt --with-credentials' sh 'pip install -r requirements.txt' sh 'pip install awscli' sh 'aws configure set aws_access_key_id default_access_key' sh 'aws configure set aws_secret_access_key default_secret_key' sh 'aws configure set default.region eu-west-1' sh 'cp config/jenkins.json config.json' } } def testStage = { stage('Tests') { sh 'pip install nose && nosetests' } } new pl.ruby.PipelineRunner(this, notificationChannel).run() { pythonStack([image: '3.9.13-alpine3.16'], { container('python') { testInstallStage.call() testStage.call() } }) }
修复方案
直接在现有apk add的安装列表里追加两个包即可:libnsl、krb5-libs。
libnsl包直接提供报错缺失的libresolv.so.2共享库krb5-libs提供libgssapi_krb5.so依赖的MIT Kerberos v5运行时库,解决链式依赖问题
如果追加上述两个包后仍有其他glibc相关共享库缺失报错,再追加安装libc6-compat包即可,这个包提供了Alpine musl libc对glibc二进制的兼容层,适配aws-psycopg2自带的预编译二进制依赖。
如果不想装兼容层,也可以在pip安装依赖时加--no-binary :all:参数强制从源码编译psycopg2,编译后的版本直接依赖Alpine原生的musl库,不会出现这类预编译二进制的兼容问题。
内容的提问来源于stack exchange,提问作者qalis
相关产品推荐
相关产品推荐

