Docker容器加载不到 .so动态链接文件(java.lang.UnsatisfiedLinkError: no xxx in java.library.path)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_19734597/article/details/102686442

找了一下午,网上文章有很多,但都不适用,因为我是通过容器进行部署服务,然后容器加载.so动态链接文件,所以网上大多数文章是设置Linux的动态链接地址,这里统一记录一下解决方法:

1、Linux设置LD_LIBRARY_PATH环境变量

普通的 Jar 包加载so可以通过这种方式设置动态链接目录,目录下是你的 .so 动态链接文件

$ vim /etc/profile
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/oas/
$ source /etc/profile

假如动态链接文件名叫做 libauthd.so,Java代码中有两种方式加载,绝对路径方式可以添加上述动态链接库所在目录的环境变量,相对路径方式需要设置上述动态链接库所在目录的环境变量

System.load("/usr/local/oas/library/auth/libauthd.so");
System.loadLibrary("authd");

2、容器加载.so文件

如果是容器部署,需要将.so文件加入到容器中,才可以找到这个.so文件,否则死活也不会找到的,k8s deploy资源文件中,我将宿主机和容器的.so所在目录都配置为 /usr/local/oas/library/auth,当然程序所需要的 .so 文件也需要在 /usr/local/oas/library/auth 下,这样就可以将 .so 文件挂载到容器中了,然后我 Java 代码使用 System.load("/usr/local/oas/library/auth/libauthd.so"); 的方式去加载容器中的 .so动态链接文件,下面是我的资源文件配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: openailab-security-auth-service
  namespace: oas-dev
  labels:
    name: openailab-security-auth-service
spec:
  replicas: 1
  selector:
    matchLabels:
      name: openailab-security-auth-service
  template:
    metadata:
      labels:
        name: openailab-security-auth-service
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: env
                operator: In
                values:
                - dev
      containers:
      - name: openailab-security-auth-service
        image: 10.12.1.202:8088/oascloud/openailab-security-auth-service:latest
        env:
        - name: APOLLO_APP_ID
          value: 'openailab-security-auth-service'
        - name: APOLLO_EUREKA_URI
          value: 'http://10.98.100.95:8080/'
        - name: APOLLO_NAMESPACE
          value: 'application'
        - name: SPRING_EUREKA_URI
          value: 'http://10.111.176.152:8080/eureka/'
        volumeMounts:
        - name: openailab-security-auth-service
          mountPath: /usr/local/logs
        - name: auth-library
          mountPath: /usr/local/oas/library/auth
        command: ['sh','-c','java -server -Xms512m -Xmx1024m -Djava.io.tmpdir=/var/tmp -Duser.timezone=Asia/Shanghai -jar openailab-security-auth-service-*.jar --server.port=8080 --spring.profiles.active=remote']
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 512Mi
            cpu: 250m
          limits:
            memory: 1024Mi
            cpu: 500m
      initContainers:
      - name: init-apollo
        image: busybox
        command: ['sh', '-c']
        args:
        - echo Prepare to apollo initialize..;
          until nc -w 1 -z 10.98.100.95 8080;
          do echo Waiting for eureka initialization to complete..; sleep 10; done;
          echo Eureka is ready.;
          until nc -w 1 -z 10.98.100.95 8090;
          do echo Waiting for admin initialization to complete..; sleep 10; done;
          echo Admin is ready.;
          echo Apollo Initialization successful!;
      volumes:
      - name: openailab-security-auth-service
        hostPath:
          path: /usr/local/logs
      - name: auth-library
        hostPath:
          path: /usr/local/oas/library/auth

到此问题解决,如果各位有解决不了的,可以评论区联系我。

猜你喜欢

转载自blog.csdn.net/qq_19734597/article/details/102686442