java - Docker 容器中的 AWS SAM CLI 导致 ClassNotFoundException

标签 java docker aws-lambda aws-sam-cli

我正在尝试使 AWS SAM CLI 成为我的 docker-compose 文件的一部分,基于 this project .一切似乎都正常进行,除了当我调用我的 Lambda 函数时我得到一个 ClassNotFoundException。我见过几个人有类似的权限问题,但即使我将所有文件都设置为 777,也没有任何变化。我还可以在日志中看到它正在解压正确的 jar 文件,我自己解压了该文件并看到它“找不到”的类。

这是我的 Docker 文件:

FROM alpine:3.8

RUN apk add --no-cache python3 python3-dev gcc musl-dev && \
    python3 -m ensurepip && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --upgrade pip setuptools && \
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
    if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
    rm -r /root/.cache

ENV PATH $PATH:/root/.local/bin

RUN pip3 install --user awscli
RUN pip3 install --user aws-sam-cli

COPY conf/lambda /var/opt/lambda
COPY lib/lambda.jar /var/opt/lambda/lambda.jar
RUN chmod -R 0777 /var/opt/lambda

RUN python -m site --user-base

WORKDIR /var/opt/lambda

以及 docker-compose.yml 的相关部分:

sam:
    build:
      context: .
      dockerfile: Dockerfile-sam
    networks:
      - sam-local
    command: sam local invoke StartPiSessionFunction -e event.json --template template.yaml
    hostname: sam
    expose:
      - 3000
    ports:
      - 3000:3000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

SAM 模板:

AWSTemplate
FormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  StartPiSessionFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Runtime: java8
      Handler: com.company.StartPiSession
      Timeout: 60
      CodeUri: lambda.jar

还有我的输出日志:

2018-08-10 15:32:41 Invoking com.company.StartPiSession (java8)
2018-08-10 15:32:41 Starting new HTTP connection (1): 169.254.169.254
2018-08-10 15:32:42 Decompressing /var/opt/lambda/lambda.jar

Fetching lambci/lambda:java8 Docker container image......
2018-08-10 15:33:18 Mounting /tmp/tmpsth810ki as /var/task:ro inside runtime container
START RequestId: eb907a6f-68c3-4afe-90b7-87a73a957322 Version: $LATEST
java.lang.ClassNotFoundException: com.company.StartPiSession
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)

END RequestId: eb907a6f-68c3-4afe-90b7-87a73a957322
REPORT RequestId: eb907a6f-68c3-4afe-90b7-87a73a957322  Duration: 3.84 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 3 MB   

最佳答案

-/tmp:/tmp 添加到 docker-compose 安装的卷中,否则您的 lambda 子 docker 将无法找到从 jar 中解压缩的类在你的父容器中

关于java - Docker 容器中的 AWS SAM CLI 导致 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51789966/

相关文章:

linux - 如何解决 Linux 上 kubernetes 仪表板设置的主机端口问题?

amazon-web-services - 如何通知用户 lambda 函数已完成?

amazon-web-services - AWS Lambda 函数超时

java - 操作和变量是否会在堆栈顶部创建?

java - 使用 SQLitestatement bindstring 方法代替简单的字符串连接来执行 sql 语句有什么优点

java - 从SQL Server 2005升级到SQL Server 2008,JAVA应用程序会出现错误吗?

java - 升级到 Gradle 2.0 : Could not find property 'Compile' on root project 后

python - 服务 'web' 无法构建,协议(protocol)错误

aws-lambda - 获取 Alexa 语音的 AWS API

Docker - 在镜像之间共享层