Jenkins传参至Dockerfile后,如何向AWS Lambda handler传命令行参数?
解决方案
AWS Lambda官方Python镜像的ENTRYPOINT程序仅允许将handler路径作为唯一参数,所以你直接在CMD中添加额外参数会触发"entrypoint requires the handler name to be the first argument"错误。以下是两种可行的解决方式:
方案一:通过环境变量直接读取参数(推荐)
首先修正Dockerfile中的ENV语法(等号两侧不能有空格,否则会导致变量名异常),然后在lambda_handler中直接读取环境变量:
修正后的Dockerfile
FROM public.ecr.aws/lambda/python:3.8 ARG LAMBDA_NAME ARG COMMAND_LINE_ARGUMENTS # 修正ENV的语法格式 ENV COMMAND_LINE_ARGUMENTS=$COMMAND_LINE_ARGUMENTS COPY $LAMBDA_NAME/* ${LAMBDA_TASK_ROOT}/ COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}/" # 保持CMD的标准格式,仅指定handler CMD [ "lambda_handler.handler" ]
修改lambda_handler.py读取环境变量
import os def handler(event, context): # 从环境变量中获取传递的参数 cmd_args = os.environ.get('COMMAND_LINE_ARGUMENTS', '') # 在这里使用参数进行业务逻辑处理 return { 'statusCode': 200, 'body': f"Command line arguments received: {cmd_args}" }
方案二:通过包装脚本传递参数
如果需要将参数直接作为函数参数传递给原handler,可以编写一个包装脚本:
创建wrapper.py
import os # 导入原handler模块 import lambda_handler def handler(event, context): cmd_args = os.environ.get('COMMAND_LINE_ARGUMENTS', '') # 调用原handler时传入参数(需对应修改原handler的参数列表) return lambda_handler.handler(event, context, cmd_args)
修改原lambda_handler.py的函数定义
def handler(event, context, cmd_args): # 直接使用传入的cmd_args参数 return { 'statusCode': 200, 'body': f"Arguments received: {cmd_args}" }
更新Dockerfile的CMD
CMD [ "wrapper.handler" ]
内容的提问来源于stack exchange,提问作者andruidthedude
相关产品推荐
相关产品推荐

