我在CI/CD (Jenkins)中使用Alpine Linux作为我的Python应用程序的Docker映像。这是针对AWS Lambda的,基本上唯一值得注意的需求是访问Postgres的aws-psycopg2
。在本地一切都可以工作,它可以很好地部署在Serverless上,也可以在AWS上工作,唯一的问题是在Jenkins上。我在那里得到一个错误:
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)
我没有以任何方式使用Oracle,比如在这个问题中。
Myjenkinsfile.groovy
:
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
是我试图解决这个问题。我试着安装许多不同的依赖关系。我应该安装什么来获得这个工作?我知道这是Alpine上缺少的一些库,因为在Ubuntu 20.04和AWS Lambda运行时它可以正常工作。
库libresolv.so.2
是系统C库的一部分。基于alpine的图像使用不同版本的C库(musl libc),它要小得多,但偶尔也会遇到这样的兼容性问题。
解决这个问题最简单的方法是切换到基于更标准的GNU libc的基于Debian或ubuntu的镜像。由于这里使用的是未经修改的图像,因此只需删除"Alpine"参考图片标签
pythonStack([image: '3.9.13'], ...)
在自定义Dockerfile中,如果你需要安装任何操作系统级别的包,你可能还需要更改包管理器调用,因为Debian/Ubuntu和Alpine有不同的打包格式,工具和名称。testInstallStage
的第一行也会受此影响。
使用基于alpine的图像的典型原因是节省空间。这里实际节省的空间相当小(几十兆字节),一旦您开始安装C头文件,图像很快就会变得比这大得多。您可能不会注意到这种更改在性能或图像大小方面的实际差异。