
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
https://github.com/mLupine/docker-lambda
一个沙盒化的本地环境,几乎完全复制真实的 AWS Lambda 环境——包括已安装的软件和库、文件结构和权限、环境变量、上下文对象和行为,甚至用户和运行进程都保持一致。
!https://raw.githubusercontent.com/mlupine/docker-lambda/master/examples/terminal.png
这是原始 https://github.com/lambci/docker-lambda 项目的部分重写和维护分支,更新包含了最新的AWS Lambda运行时和arm64支持。但此分支已放弃对基于Amazon Linux 1的旧运行时的支持。
您可以使用它在相同的严格Lambda环境中运行函数,确保它们在部署到生产环境时表现出相同的行为。您也可以使用它编译原生依赖,确保链接到与AWS Lambda上相同的库版本,然后使用AWS CLI进行部署。
您可以使用docker run的-v参数从本地目录运行Lambda函数。有两种运行模式:单次执行,或作为监听调用事件的API服务器。默认是单次执行模式,将所有日志输出到stderr,处理程序结果输出到stdout。
将(未压缩的)Lambda代码挂载到/var/task,将(未压缩的)层代码挂载到/opt,大多数运行时接受两个参数——第一个是处理程序,第二个是事件,即:
shdocker run --rm \ -v <代码_dir>:/var/task:ro,delegated \ [-v <layer_dir>:/opt:ro,delegated] \ mlupin/docker-lambda:<runtime> \ [<handler>] [<event>]
(--rm标志会在容器运行后移除它,通常这是您需要的;ro,delegated选项确保目录以只读方式挂载并具有最高性能)
您可以传递环境变量(如-e AWS_ACCESS_KEY_ID=abcd)来与AWS服务交互,或修改运行时的某些方面。详见下文。
以"保持开启"API模式运行
如果向容器传递环境变量DOCKER_LAMBDA_STAY_OPEN=1,则容器不会执行事件后关闭,而是启动一个API服务器(默认端口9001),您可以通过HTTP调用Lambda Invoke API。这允许您快速后续调用处理程序,而无需每次支付"冷启动"成本。
shdocker run --rm [-d] \ -e DOCKER_LAMBDA_STAY_OPEN=1 \ -p 9001:9001 \ -v <code_dir>:/var/task:ro,delegated \ [-v <layer_dir>:/opt:ro,delegated] \ mlupin/docker-lambda:<runtime> \ [<handler>]
(-d标志会在后台以分离模式启动容器)
您将看到:
shLambda API listening on port 9001...
然后,在另一个终端窗口中,您可以使用AWS CLI(或任何HTTP客户端,如curl)调用函数:
shaws lambda invoke --endpoint http://localhost:9001 --no-sign-request \ --function-name myfunction --payload '{}' output.json
(如果使用AWS CLI v2,需要添加--cli-binary-format raw-in-base64-out参数)
或直接使用:
shcurl -d '{}' http://localhost:9001/2015-03-31/functions/myfunction/invocations
它还支持文档化的Lambda API头:X-Amz-Invocation-Type、X-Amz-Log-Type和X-Amz-Client-Context。
如果要更改暴露端口(如在主机上使用3000端口),使用-p 3000:9001(然后访问http://localhost:3000)。
可以通过传递-e DOCKER_LAMBDA_API_PORT=<port>更改内部Lambda API端口(默认9001)。也可以通过-e DOCKER_LAMBDA_RUNTIME_PORT=<port>更改自定义运行时端口(默认9001)。
在"保持开启"模式下开发
docker-lambda可以监视处理程序(和层)代码的更改,并重启内部引导进程,使您无需关闭容器即可始终调用最新版本的代码。
要启用此功能,向docker run传递-e DOCKER_LAMBDA_WATCH=1:
docker run --rm \ -e DOCKER_LAMBDA_WATCH=1 -e DOCKER_LAMBDA_STAY_OPEN=1 -p 9001:9001 \ -v "$PWD":/var/task:ro,delegated \ mlupin/docker-lambda:java11 handler
当您修改挂载目录中的任何文件时,将看到:
Handler/layer file changed, restarting bootstrap...
下次调用将重新加载最新版本的处理程序代码。
构建镜像安装了多个额外系统包,用于构建和打包Lambda函数。您可以运行构建命令(如Java镜像上的gradle),然后使用zip或AWS SAM CLI打包函数。
shdocker run [--rm] -v <code_dir>:/var/task [-v <layer_dir>:/opt] mlupin/docker-lambda:<runtime>-build[-<arch>] <build-cmd>
sh# 在Node.js v12.x上测试当前目录中index.js文件的handler函数 docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:nodejs12.x index.handler # 在Node.js v12.x上测试当前目录中index.js文件的handler函数,强制使用x86_64架构 docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:nodejs12.x-x86_64 index.handler # 使用不同文件和处理程序,带自定义事件 docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:nodejs12.x app.myHandler '{"some": "event"}' # 在Python 3.8上测试lambda_function.py中的lambda_handler函数,带空事件 docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:python3.8 lambda_function.lambda_handler # Ruby 2.7类似 docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:ruby2.7 lambda_function.lambda_handler # 在Java 11上测试当前目录中的函数 # 目录必须按Lambda zip文件的结构布局,顶级包源目录和lib目录用于第三方jar # https://docs.aws.amazon.com/lambda/latest/dg/java-package.html docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:java11 org.myorg.MyHandler # 在.NET Core 3.1上测试,当前目录中有test.dll程序集,类名为Function,方法为FunctionHandler,带自定义事件 docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:dotnetcore3.1 test::test.Function::FunctionHandler '{"some": "event"}' # 测试provided运行时(假设当前目录中有bootstrap可执行文件) docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:provided.al2 handler '{"some": "event"}' # 带层测试(假设函数代码在./fn,层在./layer) docker run --rm -v "$PWD"/fn:/var/task:ro,delegated -v "$PWD"/layer:/opt:ro,delegated mlupin/docker-lambda:nodejs12.x # 运行自定义命令 docker run --rm --entrypoint node mlupin/docker-lambda:nodejs12.x -v # 对于大型事件,设置DOCKER_LAMBDA_USE_STDIN后可通过stdin管道输入 echo '{"some": "event"}' | docker run --rm -v "$PWD":/var/task:ro,delegated -i -e DOCKER_LAMBDA_USE_STDIN=1 mlupin/docker-lambda:nodejs12.x
更多构建Docker镜像和运行不同运行时的示例,请参见examples目录。
使用构建镜像进行编译、部署等:
sh# 编译node_modules中的原生依赖 docker run --rm -v "$PWD":/var/task mlupin/docker-lambda:nodejs12.x-build npm rebuild --build-from-source # 为特定架构编译node_modules中的原生依赖 docker run --rm -v "$PWD":/var/task mlupin/docker-lambda:nodejs12.x-build-x86_64 npm rebuild --build-from-source # 或 docker run --rm -v "$PWD":/var/task mlupin/docker-lambda:nodejs12.x-build-arm64 npm rebuild --build-from-source # 安装poetry定义的依赖 docker run --rm -v "$PWD":/var/task mlupin/docker-lambda:python3.8-build poetry install # 对于.NET Core,将编译后的代码发布到./pub,然后可使用-v "$PWD"/pub:/var/task运行 docker run --rm -v "$PWD":/var/task mlupin/docker-lambda:dotnetcore3.1-build dotnet publish -c Release -o pub # 在构建容器上运行自定义命令 docker run --rm mlupin/docker-lambda:python3.8-build aws --version # 在构建容器上运行交互式会话 docker run -it mlupin/docker-lambda:python3.8-build bash
创建自己的Docker镜像进行构建和部署:
dockerfileFROM mlupin/docker-lambda:nodejs12.x-build ENV AWS_DEFAULT_REGION us-east-1 COPY . . RUN npm install RUN zip -9yr lambda.zip . CMD aws lambda update-function-code --function-name mylambda --zip-file fileb://lambda.zip
然后执行:
shdocker build -t mylambda . docker run --rm -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY mylambda
使用Node.js模块(npm install docker-lambda)——例如在测试中:
jsvar dockerLambda = require('docker-lambda') // 同步生成,使用当前目录——失败时会抛出错误 var lambdaCallbackResult = dockerLambda({event: {some: 'event'}, dockerImage: 'mlupin/docker-lambda:nodejs12.x'}) // 手动指定目录和自定义参数 lambdaCallbackResult = dockerLambda({taskDir: __dirname, dockerArgs: ['-m', '1.5G'], dockerImage: 'mlupin/docker-lambda:nodejs12.x'})
可传递给dockerLambda()的选项:
dockerImagehandlereventtaskDircleanUpaddEnvVarsdockerArgsspawnOptionsreturnSpawnResult标签遵循Lambda运行时名称:
nodejs12.xnodejs14.xpython3.8python3.9ruby2.7java8.al2java11dotnetcore3.1provided.al2nodejs12.x-buildnodejs14.x-buildpython3.8-buildpython3.9-buildruby2.7-buildjava8.al2-buildjava11-builddotnetcore3.1-buildprovided.al2-build每个标签也可后缀架构名称。否则,Docker将使用与主机系统匹配的架构。例如:
sh# 始终在x86_64环境中执行代码(x86计算机原生,arm64上模拟) docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:nodejs12.x-x86_64 index.handler # 始终在arm64环境中执行代码(arm64计算机原生,x86上模拟) docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:nodejs12.x-arm64 index.handler # 始终在与主机架构匹配的环境中执行代码 docker run --rm -v "$PWD":/var/task:ro,delegated mlupin/docker-lambda:nodejs12.x index.handler
尝试运行与主机架构不同的容器时可能看到以下消息:
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v8) and no specific platform was requested
此时,需要在机器上安装QEMU绑定以正确模拟容器。只需执行以下命令一次:
shdocker run --rm --privileged multiarch/qemu-user-static --reset -p yes
注意,在x86机器上模拟arm64镜像或反之会非常慢。
AWS_LAMBDA_FUNCTION_HANDLER 或 _HANDLERAWS_LAMBDA_EVENT_BODYAWS_LAMBDA_FUNCTION_NAMEAWS_LAMBDA_FUNCTION_VERSIONAWS_LAMBDA_FUNCTION_INVOKED_ARNAWS_LAMBDA_FUNCTION_MEMORY_SIZEAWS_LAMBDA_FUNCTION_TIMEOUTAWS_EXECUTION_ENVAWS_EXECUTION_ARCH_X_AMZN_TRACE_IDAWS_REGION 或 AWS_DEFAULT_REGIONAWS_ACCOUNT_IDAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKENDOCKER_LAMBDA_USE_STDINDOCKER_LAMBDA_STAY_OPENDOCKER_LAMBDA_API_PORTDOCKER_LAMBDA_RUNTIME_PORTDOCKER_LAMBDA_DEBUGDOCKER_LAMBDA_NO_MODIFY_LOGS构建镜像上安装的Yum包:
development(组,包含gcc-c++、autoconf、automake、git、vim等)aws-cliaws-sam-clidocker(Docker in Docker!)clangcmake何时应该使用此镜像?
当您需要快速本地复现Lambda环境时。当您不想启动Amazon Linux EC2实例时(实际上,除网络外,这更接近真实Lambda环境,因为默认Amazon Linux实例上有许多不同的文件、权限和库)。当您不想调用真实Lambda来测试Lambda包时——您可以在开发机器上本地执行,或在CI系统上运行测试(假设支持Docker!)。
**如何实现的
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务