Я только что начал докеризацию своего приложения. Я построил свои Dockerfile
и docker-compose.yml
, и все, кажется, работает нормально, кроме одной вещи. Иногда приложение фляги запускается слишком быстро и выдает ошибку «отказано в соединении» (потому что база данных MySQL работает не полностью). Я использую healthcheck
, чтобы проверить, работает ли БД, но это, кажется, не надежно (я даже проверяю, вижу ли я show databases
, но mysql, очевидно, инициализирует больше вещей после прохождения проверки здоровья? Не уверен, что проверка здоровья для потом). В моем выводе я вижу, что база данных создается сначала, но она все еще инициализируется при запуске приложения фляги. В идеале, когда я запускаю docker-compose up, я хочу сначала увидеть эту строку,
db_1_eae741771281 | 2018-11-10T00:50:21.473098Z 0 [Note] mysqld: ready for connections.
и затем запустите мою точку входа в колбу. В настоящее время этого не происходит.
Есть ли более надежный способ убедиться, что MySQL полностью запущен перед запуском моего start.sh
?
Dockerfile:
FROM python:3.5-alpine
RUN apk update && apk upgrade
RUN apk add --no-cache curl python build-base openldap-dev python2-dev python3-dev pkgconfig python-dev libffi-dev musl-dev make gcc
RUN pip install --upgrade pip
RUN adduser -D user
WORKDIR /home/user
COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install -r requirements.txt
COPY app app
COPY start.sh ./
RUN chmod +x start.sh
RUN chown -R user:user ./
USER user
EXPOSE 5000
ENTRYPOINT ["./start.sh"]
докер-compose.yml:
version: "2.1"
services:
db:
image: mysql:5.7
ports:
- "32000:3306"
environment:
- MYSQL_DATABASE=mydb
- MYSQL_USER=user
- MYSQL_PASSWORD=user123
- MYSQL_ROOT_PASSWORD=user123
volumes:
- ./db:/docker-entrypoint-initdb.d/:ro
healthcheck:
test: "mysql --user=user --password=user123 --execute \"SHOW DATABASES;\""
timeout: 20s
retries: 20
app:
build: ./
ports:
- "5000:5000"
depends_on:
db:
condition: service_healthy
start.sh
#!/bin/sh
source venv/bin/activate
# Start Gunicorn processes
echo Starting Gunicorn.
exec gunicorn -b 0.0.0.0:5000 wsgi --chdir my_app --timeout 9999 --workers 3 --access-logfile - --error-logfile - --capture-output --log-level debug