在 AWS Lambda 函数中运行 docker 命令

问题描述 投票:0回答:2

目标

我很想知道是否可以在 AWS Lambda 函数调用中运行 docker 命令。具体来说,我正在运行

docker compose up -d
来运行一次性 ECS 任务(请参阅此 aws article 了解更多信息)。我知道使用 AWS CodeBuild 可以轻松实现这一点,但对于我的使用案例,工作负载持续时间通常低于 10 秒,使用 Lambda 会更具成本效益。

据我所知,由于 Lambda Functions 主机无法切换以将主机的 docker 守护进程挂载到 Lambda Function 的容器上,因此 Docker DooD 不可用。

尝试

我尝试了以下 Docker DinD 方法,但没有成功:

Lambda 自定义容器镜像:

ARG FUNCTION_DIR="/function"

FROM python:buster as build-image
ARG FUNCTION_DIR

# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev


RUN mkdir -p ${FUNCTION_DIR}
WORKDIR ${FUNCTION_DIR}

COPY ./* ${FUNCTION_DIR}

RUN pip install --target ${FUNCTION_DIR} -r requirements.txt

FROM python:buster
ARG FUNCTION_DIR
WORKDIR ${FUNCTION_DIR}

COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}

ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie /usr/bin/aws-lambda-rie
RUN chmod 755 /usr/bin/aws-lambda-rie ./entrypoint.sh ./runner_install_docker.sh
RUN sh ./runner_install_docker.sh

ENTRYPOINT [ "./entrypoint.sh" ]
CMD [ "lambda_function.lambda_handler" ]

runner_install_docker.sh
的内容(安装docker的脚本)

#!/bin/bash

apt-get -y update

apt-get install -y \
    software-properties-common build-essential \
    apt-transport-https ca-certificates gnupg lsb-release curl sudo

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

sudo chmod u+x /usr/bin/*
sudo chmod u+x /usr/local/bin/*
sudo apt-get clean
sudo rm -rf /var/lib/apt/lists/*
sudo rm -rf /tmp/*

当我运行

docker compose
或其他 docker 命令时,出现以下错误:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

amazon-web-services docker aws-lambda
2个回答
1
投票

Docker 在 AWS Lambda 运行时中不可用。即使您将其构建到自定义容器中,Lambda 函数也需要作为特权 docker 容器运行,docker-in-docker 才能工作,而 AWS Lambda 不支持这一点。

具体来说,我正在运行 docker compose up -d 来运行一次性 ECS 任务

您不需要尝试使用 docker-compose ECS 功能来执行此操作,而是需要考虑通过 AWS SDKs 之一调用 ECS RunTask 命令。


0
投票

通过tls连接远程docker主机似乎是可行的。虽然安全地设置它相当复杂,但我认为这是值得的 - 考虑到性能增益,特别是在(代码构建)CI 环境中。

© www.soinside.com 2019 - 2024. All rights reserved.