ConnectionRefusedError: Невозможно подключить контейнер MySQL при создании docker образа для приложения flask - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь создать docker образ для приложения flask. Приложение использует другое MySQL docker изображение в качестве зависимости, и я получаю следующий журнал ошибок

Generating a RSA private key
db_1   | ..+++++
db_1   | ..........................................................................+++++
db_1   | unable to write 'random state'
db_1   | writing new private key to 'client-key.pem'
db_1   | -----
db_1   | Certificates initialized
db_1   | MySQL init process in progress...
web_1  | Connecting root@127.0.0.1:3306
web_1  | Traceback (most recent call last):
web_1  |   File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 583, in connect
web_1  |     **kwargs)
web_1  |   File "/usr/local/lib/python3.6/socket.py", line 724, in create_connection
web_1  |     raise err
web_1  |   File "/usr/local/lib/python3.6/socket.py", line 713, in create_connection
web_1  |     sock.connect(sa)
web_1  | ConnectionRefusedError: [Errno 111] Connection refusedweb_1  | Connecting root@127.0.0.1:3306
web_1  | Traceback (most recent call last):
web_1  |   File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 583, in connect

ниже мой Dockerfile и docker -compose.yml

Dockerfile

# this is an official Python runtime, used as the parent image
FROM python:3.6.5-slim

# set the working directory in the container to /app



ADD . /app
WORKDIR /app
RUN pip install -r requirements.txt
# unblock port 80 for the Flask app to run on
WORKDIR /app
ADD . /app/datajoint-python
RUN pip install -e datajoint-python
EXPOSE 1234
CMD ["python", "run.py"]

docker -compose.yml

version: '2'
services:
  web:
    build: .
    ports:
      - "1234:1234"
    volumes:
      - .:/app
    depends_on:
      - "db"
    restart: always
  db:
    image: datajoint/mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=simple
      - MYSQL_USER=root
    restart: always

Я пробовал много вещей, таких как скопировать файл id_rsa в каталог моего приложения. Но я не могу понять, почему появляется ошибка. Я строю и пытаюсь запустить все, выполнив

sudo docker-compose up

Я запускаю все это на MacOS. Любая помощь будет оценена.

1 Ответ

1 голос
/ 18 марта 2020

Проблема заключается в том, что ваш веб-контейнер пытается подключиться к экземпляру MySQL до его запуска и готовности к обработке запросов. depends_on: недостаточно для исправления зависимости.

db_1   | MySQL init process in progress...
web_1  | Connecting root@127.0.0.1:3306
web_1  | Traceback (most recent call last):

Вы можете исправить эту проблему, введя функцию ожидания для ваших веб-приложений, для этого измените файл docker на

# this is an official Python runtime, used as the parent image
FROM python:3.6.5-slim

ADD . /app
WORKDIR /app
RUN apt-get update && apt-get install netcat -y
RUN pip install -r requirements.txt
# unblock port 80 for the Flask app to run on
WORKDIR /app
ADD . /app/datajoint-python
RUN pip install -e datajoint-python
EXPOSE 1234
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

добавить docker -входную точку. sh (chmod a + x)

#!/bin/sh -e

until nc -vz db:3306 > /dev/null; do
    >&2 echo "db:3306 is unavailable - sleeping"
    sleep 2
  done
  >&2 echo "db:3306 is up"

python run.py

exit 0
...