Не удается запустить AWS SAM CLI под Docker - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать образ Docker для AWS SAM CLI , но при вызове любой функции выдается ошибка: «Невозможно импортировать модуль« index »».Я могу успешно запустить тот же тест за пределами Docker.Вы можете клонировать контрольный пример здесь или просмотреть файлы ниже.

Я уже попробовал следующее:

  • Установка разрешений для файлов и родительской папки на 777 (или 755).
  • Отключение SELinux в демоне Docker (или его включение).
  • Запуск Docker в привилегированном режиме (или нет).
  • Я получаю ту же ошибку, используястарый (SAM 0.22) Образ Docker .
  • Локальное выполнение той же функции, как описано ниже (работает).
  • Архивирование папки и запуск в AWS (работает).

Эти решения, вероятно, не применяются:

  • Неправильный формат файла zip, включая родительскую папку (файл zip не используется).
  • Проблемы, связанные с зависимостями NPM или node_modules (index.js не имеет зависимостей).
  • Ошибки компиляции в index.js (синтаксис правильный, работает вне Docker и на AWS).
  • Том монтируется на хост, как описано здесь .

Dockerfile

FROM alpine:3.6
WORKDIR /usr/src/app
RUN apk add --no-cache py-pip
RUN pip install --no-cache-dir aws-sam-cli

event.json

{}

index.js

exports.handler = function(event, context, callback) {
    return callback(null, {
        'body': 'Hello, World!'
    });
};

template.yml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: HelloWorld
      CodeUri: .
      Handler: index.handler
      Runtime: nodejs6.10
      Timeout: 300

Для запускаSAM локально:

sam local invoke -t template.yml -e event.json HelloWorld

Запуск SAM локально успешен:

{"body":"Hello, World!"}

Для запуска SAM под Docker:

docker build -t hello .
docker run \
    -v $(pwd):/usr/src/app \
    -v /var/run/docker.sock:/var/run/docker.sock \
    hello sam local invoke -t template.yml -e event.json HelloWorld

Ошибка запуска SAM под Docker:

Unable to import module 'index': Error
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)

ОС: Ubuntu 16.04.1 x86_64

Версия Docker: 18.03.1-ce

Версия SAM CLI: 0.3.0

1 Ответ

0 голосов
/ 23 августа 2018

Вы должны ссылаться на каталог, относящийся к жесткому диску вашего хоста, а не к первому дереву накопителя док-контейнера.

Чтобы сделать это с SAM cli, используйте параметр --docker-volume-basedir "$PWD" (или -v "$PWD") в sam local invoke.

От: sam local invoke --help

--docker-volume-basedir value, -v value Необязательно.Указывает местонахождение в зависимости от того, где находится файл SAM.Если Docker запущен на удаленном компьютере, вы должны смонтировать путь, в котором находится файл SAM на докере, и изменить это значение, чтобы оно соответствовало удаленному компьютеру.[$SAM_DOCKER_VOLUME_BASEDIR]

Итак, с вашей вышеописанной настройкой, чтобы запустить SAM под докером:

docker build -t hello .
docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    hello sam local invoke -t template.yml -e event.json HelloWorld -v $(pwd)
...