Amazon web services Can';t在Docker下运行AWS SAM CLI
我试图为创建Docker映像,但调用任何函数都会出现错误:“无法导入模块‘索引’”。我可以在Docker之外成功运行相同的测试用例。您可以克隆测试用例或查看下面的文件 我已经尝试了以下方法: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
- 将文件和父文件夹的权限设置为777(或755)
- 在Docker守护程序中禁用SELinux(或启用它)
- 在特权模式下运行Docker(或不运行)
- 我使用旧的(SAM 0.22)得到相同的错误
- 在本地运行如下所述的相同功能(有效)
- 压缩文件夹并在AWS(works)上运行
- zip文件的格式不正确,包括父文件夹(未使用zip文件)
- 与NPM依赖项或节点_模块相关的问题(index.js没有依赖项)
- index.js中的编译错误(语法正确,在Docker之外和AWS上工作)
- 卷正在按所述装载到主机上
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)
有关于这个问题的最新消息吗?