目标
我很想知道是否可以在 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?
Docker 在 AWS Lambda 运行时中不可用。即使您将其构建到自定义容器中,Lambda 函数也需要作为特权 docker 容器运行,docker-in-docker 才能工作,而 AWS Lambda 不支持这一点。
具体来说,我正在运行 docker compose up -d 来运行一次性 ECS 任务
您不需要尝试使用 docker-compose ECS 功能来执行此操作,而是需要考虑通过 AWS SDKs 之一调用 ECS RunTask 命令。
通过tls连接远程docker主机似乎是可行的。虽然安全地设置它相当复杂,但我认为这是值得的 - 考虑到性能增益,特别是在(代码构建)CI 环境中。