AWS SAM CLI в контейнере Docker приводит к исключению ClassNotFoundException
Я пытаюсь сделать AWS SAM CLI частью моего файла docker-compose, основанного на этом проекте. Кажется, что все идет соответствующим образом, за исключением того, что когда я вызываю свою функцию 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
0 ответов
Добавлять - /tmp:/tmp
к томам, установленным docker-compose
или ваш дочерний докер лямбда не сможет найти классы, несжатые из jar в вашем родительском контейнере