Не удается получить доступ к приложению docker с localhost с помощью docker -compose - PullRequest
2 голосов
/ 30 мая 2020

перед тем, как я начну: я уже искал этот вопрос и реализовал, что такое «Решения», и это не помогло (установка хоста на 0.0.0.0). Итак, с учетом этого,

Структура каталогов

|-- osr
|    |-- __init__.py
|-- requirements.txt
|-- Dockerfile
|-- docker-compose.yml

Dockerfile:

FROM python:3.7.5-buster

EXPOSE 5000 # i have tried with and without this

ENV INSTALL_PATH /osr
ENV FLASK_APP osr
ENV FLASK_ENV development
RUN mkdir -p $INSTALL_PATH

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD [ "flask", "run", "--host=0.0.0.0"]

docker -compose.yml:

version: '3.8'
services:
    web:
        build: .
        ports:
            - '5000:5000'
        expose:
            - '5000'
        volumes:
            - .:/osr

__ init __. Py

import os
from flask import Flask

def create_app(test_config=None):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev'
    )

    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

docker -compose build web docker -compose run web

 * Serving Flask app "osr" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 225-441-434

все приведенные ниже возвращают "хммм" t перейти на эту страницу "

http://localhost
http://localhost:5000/hello
http://127.0.0.1:5000/hello

Я даже пытался перейти на IP-адрес контейнера с помощью

docker exe c -it 49e677 bash ip add | grep global inet 172.21.0.2/16 brd 172.21.255.255 scope global eth0

http://127.21.0.2:5000/hello # nothing

Ничего.

Я уверен, что само приложение работает нормально, так как я могу просто запустить приложение напрямую.

$env:FLASK_APP="osr"
$env:FLASK_ENV="development"
flask run --host=0.0.0.0

И работает нормально

localhost

РЕДАКТИРОВАТЬ: ОБНОВЛЕНИЕ

Я действительно могу добраться до контейнера, когда я запускаю его через файл Dockerfile ... используя

docker run -it -p 5000: 5000 osr_web # контейнер, созданный с помощью docker -compose build

Благодаря этому я могу получить доступ к конечной точке через localhost: 5000 / hello

Таким образом, проблема возникает в l ie при его раскрутке через docker -compose run

Это вообще помогает?

UPDATE 2

Я обнаружил, что при запуске docker ps -a я вижу, что Docker run фактически открывает порт, но docker -compose run не делает:

enter image description here

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Вы уверены, что приложение работает нормально? Я попытался запустить ваш python __init__.py файл и получил ошибку.

python osr/__init__.py 
  File "osr/__init__.py", line 11
    def hello():
    ^
IndentationError: unexpected indent

Он работает после исправления ошибки отступа.

@app.route('/hello')
def hello():
    return 'Hello, World!'

$ docker run -d -p 5000:5000 harik8/osr:latest 
76628f86fecb61c0be4a969d3c91c5c575702ad8063b594a6c1c90b498ea25f1

$ curl http://127.0.0.1:5000/hello
Hello, World!

Вы не можете запустить оба docker и docker - объединяются в порт 5000 одновременно. Либо запускайте по одному, либо измените порт хоста docker -compose / dockerfile.

$ docker ps -a | grep osr
8b885c4a9654        harik8/osr:latest                                     "flask run --host=0.…"   12 seconds ago       Up 11 seconds               0.0.0.0:5000->5000/tcp
$ docker ps -a | grep q5      
70f38bf11e26        q5_web                                                "flask run --host=0.…"   About a minute ago   Up 10 seconds               0.0.0.0:5001->5000/tcp

$ docker ps -a | grep q5
f9f6ba999109        q5_web                                                "flask run --host=0.…"   5 minutes ago       Up 5 minutes                0.0.0.0:5000->5000/tcp                                                                                                   q5_web_1
$ docker ps -a | grep osr
93fb421333e4        harik8/osr:latest                                     "flask run --host=0.…"   18 seconds ago      Up 18 seconds               5000/tcp 
0 голосов
/ 30 мая 2020

Я нашел проблему. Для справки, я использую следующие версии:

docker-compose version 1.25.5, build 8a1c60f6

Docker version 19.03.8, build afacb8b

Было несколько проблем: Прежде всего, чтобы открыть порты, которые мне нужны запустите один из двух вариантов.

docker-compose up web или docker-compose run --service-ports web

Простой запуск docker-compose run web не приведет к открытию портов.

Как только это было закончено, я смог получить доступ к конечной точке. Однако я начал получать еще одну странную ошибку,

flask.cli.NoAppException
flask.cli.NoAppException: Failed to find Flask application or factory in module  
"osr". Use "FLASK_APP=osr:name to specify one.

. Я не испытывал этого, просто используя docker run -it -p 5000:5000 osr_web, что было странно. Однако я заметил, что не установил рабочий каталог в Dockerfile.

Я изменил файл Dockerfile на этот:

FROM python:3.7.5-buster

EXPOSE 5000
ENV INSTALL_PATH /osr
ENV FLASK_APP osr
ENV FLASK_ENV development
RUN mkdir -p $INSTALL_PATH

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

# added this line
WORKDIR $INSTALL_PATH

COPY . .

CMD [ "flask", "run", "--host=0.0.0.0"]

Я считаю, что вы можете обойтись без установки WORK_DIR, если превратите приложение flask в пакет и установите его.

...