Контейнер с колбой не работает с помощью докера - PullRequest
0 голосов
/ 19 июня 2019

Так что моя проблема очень проста, но все еще не может ее решить, и она не работает так, как я хотел.

пример файла Docker:

FROM ubuntu:16.04

RUN apt-get update -y && \
    apt-get install -y python3-pip python3-dev
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip3 install -r requirements.txt
COPY . /
RUN chmod a+x start.sh
EXPOSE 5000
CMD ["./start.sh"]

образец start.sh

#!/usr/bin/env bash

# sleep 600
nohup python3 /code/app.py &
python3 /code/helloworld_extract.py

образец колбы app.py

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return """
  <h1>Python Flask in Docker!</h1>
  <p>A sample web-app for running Flask inside Docker.</p>
  """


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

Итак, моя проблема в том, как только я создаю образ и запускаю его, docker run --name flaskapp -p5000:5000 docker-flask:latest ... Я не могудостичь локального: 5000.Хотя, если я попаду внутрь контейнера и запущу команду explict nohup с python3 app.py.Я могу связаться с localhost.

Итак, почему я не могу добраться до хоста localhost с помощью команды run?

Дело в том, что мне нужно запустить 2 скрипта, один - флак, а другой - helloworld_extract.py, который в итоге завершается послезапись некоторой информации в файлы.

1 Ответ

2 голосов
/ 19 июня 2019

Когда ваш start.sh скрипт говорит

#!/bin/sh
do_some_stuff_in_the_background &
some_foreground_process

Весь жизненный цикл контейнера привязан к some_foreground_process. В вашем случае, поскольку вы поясняете, что он выполняет некоторую начальную загрузку данных и завершает работу, после его завершения сценарий start.sh завершается, и поэтому контейнер завершается.

(Как правило, старайтесь избегать nohup и & на земле Докера, поскольку это приводит к путанице в подобных вопросах.)

Я бы предложил сделать процесс основного контейнера только сервером Flask.

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

Вы не говорите, что в скрипте загрузчика. Поскольку его жизненный цикл полностью отличается от основного приложения, имеет смысл запускать его отдельно; Вы можете заменить CMD на docker run опции. Скажем, вам нужно заполнить некоторые общие данные в файловой системе. Вы можете:

# Build the image
docker build -t myimage .

# Create a (named) shared filesystem volume
docker volume create extract

# Start the Flask server
docker run -d -p 5000:5000 -v extract:/data myimage

# Run the script to prepopulate the data
docker run -v extract:/data myimage python3 /code/helloworld_extract.py

Обратите внимание, что во всех командах используется одинаковое имя тома extract. Путь /data является произвольным выбором, хотя, поскольку обе команды выполняются на одном и том же образе, имеет смысл, что они будут иметь одинаковую структуру файловой системы.

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