Docker. Не удалось установить sh новое соединение: [Errno 111] Соединение отклонено ' - PullRequest
1 голос
/ 27 апреля 2020

Я хочу отправить запрос на отправку из одного контейнера в другой, оба приложения flask.

Когда я нажимаю кнопку sh в форме, мой запрос не может быть отправлен с ошибкой:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=5000): Max 
retries exceeded with url: /users/ (Caused by 
NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe0e5738ac0>: Failed to 
establish a new connection: [Errno 111] Connection refused'))

Я пытаюсь запустить его только на локальном хосте. Когда я использую docker -составить, все в порядке, пока я не пытаюсь отправить запрос.

код приложения 1 (приложение, из которого я пытаюсь отправить запрос):

from settings import app, db
from flask import jsonify, request
from models import User     

@app.route('/users/', methods=['POST'])
def users_post():
    if request.json:
        new_user = User(
            email=request.json['email'], 
            first_name=request.json['first_name'], 
            last_name=request.json['last_name'], 
            password=request.json['password'])

        db.session.add(new_user)
        db.session.commit()
        return jsonify({'msg': 'user succesfully added'})
    else:
        return jsonify({'msg': 'request should be in json format'})



if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')

Контейнер dockerfile 1:

FROM python:3

COPY . ./app

WORKDIR /app

RUN pip3 install -r requirements.txt

EXPOSE 5000 5050

CMD ["python3", "app.py"]

код приложения 2:

@app.route('/', methods=['GET', 'POST'])
def users_get():
    if request.method == 'POST':
        request.form['email']
        data = {
            'email':request.form['email'], 
            'first_name':request.form['first_name'], 
            'last_name':request.form['last_name'], 
            'password':request.form['password']
        }
        r = requests.post('http://0.0.0.0:5000/users/', data=data)
        print(r.text)
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5050)

dockerfile в приложении 2 аналогичен первому.

docker -compose

version: '3'

services:
  web:
    build: ./core
    command: python3 app.py
    volumes:
      - .:/core
    ports:
      - "5000:5000"
    links:
      - new_app

  new_app:
    build: ./new_app
    command: python3 app.py
    volumes:
      - .:/new_app
    ports:
      - "5050:5050"

Что я пропустил?

1 Ответ

2 голосов
/ 27 апреля 2020
  1. app1 отсутствует порт, вы должны добавить его:

    app.run(debug=True, host='0.0.0.0', port=5000)

  2. при вызове app1 из app2 вы должны использовать его хост вместо 0.0.0.0:

    r = requests.post('http://web:5000/users/', data=data)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...