【发布时间】:2018-11-10 01:41:25
【问题描述】:
我刚刚开始 dockerize 我的应用程序。我已经建立了我的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.
然后启动我的烧瓶应用程序入口点。目前,它不这样做。
在启动我的start.sh 之前,是否有更可靠的方法来确保 MySQL 完全启动?
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"]
docker-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
【问题讨论】:
-
@Yann39 我已经看过那个帖子并尝试了帖子中推荐的所有解决方案,但是,这些都不起作用。正如您在我的代码中看到的那样,我有
health_check,但仍然遇到问题。
标签: docker docker-compose