Amazon web services Can';t在Docker下运行AWS SAM CLI

Amazon web services Can';t在Docker下运行AWS SAM CLI,amazon-web-services,docker,aws-lambda,aws-sam-cli,Amazon Web Services,Docker,Aws Lambda,Aws Sam Cli,我试图为创建Docker映像,但调用任何函数都会出现错误:“无法导入模块‘索引’”。我可以在Docker之外成功运行相同的测试用例。您可以克隆测试用例或查看下面的文件 我已经尝试了以下方法: 将文件和父文件夹的权限设置为777(或755) 在Docker守护程序中禁用SELinux(或启用它) 在特权模式下运行Docker(或不运行) 我使用旧的(SAM 0.22)得到相同的错误 在本地运行如下所述的相同功能(有效) 压缩文件夹并在AWS(works)上运行 这些解决方案可能不适用: zi

我试图为创建Docker映像,但调用任何函数都会出现错误:“无法导入模块‘索引’”。我可以在Docker之外成功运行相同的测试用例。您可以克隆测试用例或查看下面的文件

我已经尝试了以下方法:

  • 将文件和父文件夹的权限设置为777(或755)
  • 在Docker守护程序中禁用SELinux(或启用它)
  • 在特权模式下运行Docker(或不运行)
  • 我使用旧的(SAM 0.22)得到相同的错误
  • 在本地运行如下所述的相同功能(有效)
  • 压缩文件夹并在AWS(works)上运行
这些解决方案可能不适用:

  • zip文件的格式不正确,包括父文件夹(未使用zip文件)
  • 与NPM依赖项或节点_模块相关的问题(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!"}
要在Docker下运行SAM:

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
在Docker下运行SAM失败:

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

您必须引用相对于主机硬盘驱动器的目录,而不是第一个docker容器驱动器树

要使用SAM cli执行此操作,请在
SAM local invoke上使用选项
--docker volume basedir“$PWD”
(或
-v“$PWD”

发件人:
sam本地调用--help

--docker volume basedir值
-v值
可选。指定SAM文件存在的位置basedir。如果Docker正在远程计算机上运行,则必须装载Docker计算机上SAM文件所在的路径,并修改此值以匹配远程计算机。[
$SAM\u DOCKER\u VOLUME\u BASEDIR
]

因此,通过上述设置,要在docker下运行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)

有关于这个问题的最新消息吗?