Когда ваш 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
является произвольным выбором, хотя, поскольку обе команды выполняются на одном и том же образе, имеет смысл, что они будут иметь одинаковую структуру файловой системы.