当前位置: 首页 > 面试题库 >

使用环境变量从另一个Docker容器访问本地SQS服务

徐学潞
2023-03-14
问题内容

我有一个flask应用程序,无论何时遇到端点,该应用程序都需要与SQS服务进行交互。我正在使用sukumarporeddy/sqs:fp基本镜像为https://github.com/vsouza/docker-
SQS-local的

docker镜像在本地模拟SQS服务,并在配置中添加了两个队列。

我需要从另一个以 app_service* 运行的 应用程序 访问此服务。这两个服务使用 docker-compose.yml
文件运行,其中我提到了两个服务。
***

app_service

sqs_service

在构建 应用程序 的形象,我设置环境变量来访问 sqs_service
作为QUEUE_ENDPOINT=http://sqs_service:9324。但是,当我尝试访问该应用程序的 sqs_service时
,它说的是无效的队列端点。

我正在使用 boto3 连接到本地 sqs_service

boto3.client('sqs', endpoint_url=os.getenv("QUEUE_ENDPOINT"), region_name='default')

这是 docker-compose.yml 文件。

  app_service:
    container_name: app_container
    restart: always
    image: app
    build: 
      context: ./dsdp
      dockerfile: Dockerfile.app.local
    ports:
      - "5000:5000"
    env_file:
        - ./local_secrets.env
    command: flask run --host=0.0.0.0 --port 5000

  sqs_service:
    container_name: sqs_container
    image: sukumarporeddy/sqs:fp
    ports:
      - "9324:9324"

local_secrets.env:

QUEUE_ENDPOINT=https://sqs_service:9324
FEEDER_QUEUE_URL=https://sqs_service:9324/queue/feeder
PREDICTION_QUEUE_URL=https://sqs_service:9324/queue/prediction
AWS_ACCESS_KEY_ID=''
AWS_SECRET_ACCESS_KEY=''

尝试将消息发送到本地运行的SQS服务时遇到的错误。

ValueError

ValueError:无效的终结点:https:// sqs_service:9324

我在哪里犯错?


问题答案:

不知何故,我无法使用环境变量中提到的服务名称来使用SQS队列。这是我所做的。

从环境变量中获取服务名称,使用python中的 套接字 库获取服务的IP地址,并使用该IP地址来格式化和创建QUEUE端点url。

import socket
queue_endpoint_service = os.getenv("QUEUE_ENDPOINT_SERVICE")
queue_endpoint_port = os.getenv("QUEUE_ENDPOINT_PORT")
feeder_queue = os.getenv("FEEDER_QUEUE")
prediction_queue = os.getenv("PREDICTION_QUEUE")
queue_endpoint_ip = socket.gethostbyname(queue_endpoint_service)
queue_endpoint = f"http://{queue_endpoint_ip}:{queue_endpoint_port}"
mc = boto3.client('sqs', endpoint_url=queue_endpoint, region_name='default')
feeder_queue_url = f"{queue_endpoint}/queue/{feeder_queue}"
prediction_queue_url = f"{queue_endpoint}/queue/{prediction_queue}"

我现在可以通过点击flask应用程序中的端点来发送消息。

注意: 还使用了 Adiii 提到的新 docker 映像。不再使用旧图像。



 类似资料:
  • 问题内容: 我基于两个不同的图像创建了两个docker容器。一个数据库,另一个用于网络服务器。这两个容器都在我的Mac OS X上运行。 我可以从主机访问数据库容器,也可以从主机访问Web服务器。 但是,如何从Web服务器访问数据库连接? 我启动数据库容器的方式是 我开始了wls容器作为 我可以通过连接到主机上的数据库 我可以以以下方式访问主机上的wls: 问题答案: 最简单的方法是使用–link

  • 我基于两个不同的映像创建了两个docker容器。一个是db,另一个是WebServer。这两个容器都在我的mac OSX上运行。 我可以从主机访问db容器,也可以从主机访问webserver。 我可以访问主机上的wls作为

  • 问题内容: 我正在尝试为将我的应用程序容器连接到postgres容器提供一个便携式解决方案。“便携式”是指我可以给用户两个命令,每个容器一个,它们将始终协同工作。 我的本地PC上运行着一个postgres docker容器,我这样运行它, 我可以使用address从python flask应用程序访问它。 我也将python应用程序也放置在docker容器中,但无法连接到postgres容器。 地

  • 问题内容: 从 尚未在Dockerfile中声明的Docker 容器获取环境变量的最简单方法 是什么 ? 例如,通过某个会话设置的环境变量? 我可以做到,但是我更喜欢只返回值的东西。 我尝试使用,但是替换似乎发生在容器外部,因此我没有从容器中获取env var,而是从我自己的计算机中获取了env var。 谢谢。 问题答案: 在容器中运行以使变量替换发生在容器中的正确方法是:

  • 问题内容: 目前,我在需要连接到camunda的docker容器内运行一个node.js应用程序,该容器在另一个容器中运行。 我使用以下命令启动容器 这两个应用程序现在都在运行,我可以通过在端口8000上导航到主机的IP来访问camunda,运行wget 还会返回camunda页面。使用和键入我的应用程序容器时,我无法访问camunda。相反,我得到以下错误: 当我使用将我的应用程序容器链接到ca

  • 问题内容: 我已经设置了带有多个docker容器的服务器,可以使用jwilders nginx reversre proxy 访问。运行容器时,可以设置VIRTUAL_HOST环境变量。在容器启动后,我一直试图找出一种更新这些方法的方法。 解决方案在这里发布: 您只需停止docker daemon并在以下位置更改容器配置 要求您停止docker守护程序,但我不想不必诉诸于此。 另一个在这里,使用d