如何使用 docker-compose 从一个容器发送到另一个容器?

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

我有两个容器。当我使用 fastapi 调用第一个容器时,容器使用请求将图像发送到第二个容器,第二个容器接收图像并将其存储在卷中。我收到错误。

第一个容器的文件:

主.py

import base64
import io
import json
import logging
import os
from io import BytesIO

import requests
import uvicorn
from fastapi import FastAPI, File, Form, UploadFile
from fastapi.responses import FileResponse
from PIL import Image

app = FastAPI()


@app.get("/")
def read_root():
    img = Image.new('RGB', (200, 50), color = (73,195,150))
    img.save('newfile.jpg')
    print("image saved")
    img.show()
    ##send the image
    api = 'http://localhost:81/test'

    filename ='newfile.jpg'
    up = {'image':(filename, open(filename, 'rb'))}
    #json = {'first': "Hello", 'second': "World"}
    request = requests.post(api, files=up)
    print(request.text)
    return {"image":"sent successfully:", "statuscode":request.status_code}

Dockerfile:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY ./app /app
WORKDIR /app
RUN pip install Pillow requests python-multipart
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
COPY . /app

第二个容器的文件: main.py:

from fastapi import FastAPI,UploadFile,File,Form
from PIL import Image
import uvicorn
import io
import json                    
import base64                  
import logging             
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw 
import shutil
app = FastAPI()

def read_imagefile(file) -> Image.Image:
    image = Image.open(BytesIO(file))
    return image
@app.post("/test")
async def predict_api(file: UploadFile = File(...)):
    extension = file.filename.split(".")[-1] in ("jpg", "jpeg", "png")
    if not extension:
        return "Image must be jpg or png format!"
    img = read_imagefile(await file.read())
    
    #img = Image.open(myfile) 
    draw = ImageDraw.Draw(img)
    # font = ImageFont.truetype(<font-file>, <font-size>)
    font = ImageFont.truetype("sans-serif.ttf", 16)
    # draw.text((x, y),"Sample Text",(r,g,b))
    draw.text((0, 0),"Manipulated",(255,255,255),font=font)
    img.save('sample-out.jpg')
    return {"image": "saved in vol"}

Dockerfile:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY ./app /app
WORKDIR /app
RUN pip install Pillow python-multipart
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "81"]
COPY . /app

Docker-compose 文件:

version: '3.8'

services:
  app1:
    build: ./app1/
    ports:
      - 80:80
    networks:
      - my-proxy-net
  app2:
    build: ./app2/
    volumes:
      - myapp:/app
    ports:
      - 81:81

networks:
  my-proxy-net:
    external: true
volumes:
  myapp:
docker-compose
2个回答
0
投票

如果您的服务位于同一网络中,它们可以通过使用各自的容器名称作为主机名来相互访问:

以您的情况为例:

http://app1

使用

docker container ps -a

并检查“NAMES”栏以争取正确的名字来称呼


0
投票

如果你想从一个容器调用另一个容器端口,那么你可以使用容器名称或服务器IP 示例:我有前端应用程序和后端容器。我想调用后端集装箱端口。我在 .env 文件中写入:我的前端应用程序。这个案例对我有用。

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