Docker容器运行但使用curl无法访问的问题

35次阅读
没有评论

问题描述

在将Docker容器托管在EC2实例上时遇到了问题。他想在EC2上托管容器,并运行所有的测试用例,一旦成功,就会部署到Fargate上。他在appspec.yml文件中定义了一些钩子脚本,以及在其中运行Docker容器的命令。然而,在运行验证脚本时遇到了问题。

以下是部分appspec.yml文件的内容:

version: 0.0
os: linux
files:
  - source: /
    destination: /root/MY-BACKEND
    overwrite: true
hooks:
  BeforeInstall:
    - location: ./scripts/before_install.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: ./scripts/after_install.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: ./scripts/app_start.sh
      timeout: 300
      runas: root
  ApplicationStop:
    - location: ./scripts/app_stop.sh
      timeout: 300
      runas: root
  ValidateService:
    - location: ./scripts/validate_server.sh
      timeout: 300
      runas: root

其中validate_server.sh脚本中执行了一个curl命令来验证服务是否可访问。

解决方案

请注意以下操作可能需要根据实际情况进行修改。

问题是由于后端需要花费10分钟才能完全加载,所以在验证脚本中执行的curl -m 5 http://0.0.0.0命令时,后端尚未准备好返回响应,因此引发了[stderr]curl: (56) Recv failure: Connection reset by peer错误。为了解决这个问题,我们可以在validate_server.sh脚本中的curl命令之前添加一个适当的等待时间。

以下是解决方案的步骤:

  1. 打开validate_server.sh脚本。
  2. 在执行curl命令之前,添加一个适当的等待时间,以确保后端完全加载。
  3. 保存脚本并重新运行验证。

以下是在validate_server.sh脚本中添加等待时间的示例:

#!/bin/bash
# 等待后端完全加载
sleep 20s
# 验证服务是否可访问
curl -m 5 http://0.0.0.0

在上述示例中,我们在执行curl命令之前添加了sleep 20s命令,以等待后端加载完成。这将确保在验证服务可访问之前等待一段时间,从而避免连接错误。

请根据实际情况和需求,调整等待时间,以确保后端完全加载并准备好接受请求。

总结

通过在验证脚本中添加适当的等待时间,您可以解决Docker容器运行时使用curl无法访问的问题。这可以确保后端在验证服务可访问之前有足够的时间来加载和准备。

正文完