You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker-Compose端口未暴露:Lambda外部访问连接重置问题求助

解决Docker部署的SAM本地API无法从外部访问的问题

问题背景

我最近在Docker里部署AWS SAM本地API时遇到了个棘手的问题:从宿主机或外部机器访问127.0.0.1:3000/create-loan端点时,执行命令curl -XPOST 127.0.0.1:3000/create-loan会返回Recv failure: Connection reset by peer,但进入容器内部测试同一个端点却完全正常。

查看Docker容器状态,billing_lambda_1显示运行正常,端口配置是0.0.0.0:3000->3000/tcp,数据库容器billing_db_1的5432端口映射也能正常访问,排除了端口映射本身的问题。

我的环境配置

docker-compose.yml

version: '3'
services:
  lambda:
    build: .
    volumes:
      - ./:/app
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - db
    environment:
      - PYTHONPATH=${PWD}/billing
    ports:
      - "3001:3000"
  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=${BILLING_USER}
      - POSTGRES_PASSWORD=${BILLING_PASSWORD}
      - POSTGRES_DB=${BILLING_DB}
      - POSTGRES_HOST=${BILLING_HOST}
volumes:
  db-data:
    driver: local

Dockerfile

FROM python:3.7
RUN pip3 install aws-sam-cli
EXPOSE 3000
ENTRYPOINT ["/usr/local/bin/sam"]
RUN apt-get install curl
RUN pip3 install pipenv
WORKDIR /app
RUN pipenv install --dev
CMD ["local", "start-api"]

排查与解决过程

一开始我反复检查端口映射配置,确认0.0.0.0:3000->3000/tcp的映射是正确的,但外部还是无法连接。后来突然反应过来:SAM本地的start-api命令默认绑定的是127.0.0.1,也就是服务只监听容器内部的localhost接口,即使Docker把端口映射到了宿主机,外部请求也无法穿透到容器内的服务。

找到问题根源后,我修改了Dockerfile中的CMD命令,添加--host 0.0.0.0参数,让SAM本地API监听容器的所有网络接口:

CMD ["local","start-api","--host","0.0.0.0"]

重新构建并启动容器后,外部再访问127.0.0.1:3000/create-loan就完全正常了!

内容的提问来源于stack exchange,提问作者JoeLoco

火山引擎 最新活动