【问题标题】:ConnectionRefusedError: Unable to connect MySQL container while building docker image for a flask appConnectionRefusedError:在为烧瓶应用程序构建 docker 映像时无法连接 MySQL 容器
【发布时间】:2020-03-17 21:09:55
【问题描述】:

我正在尝试为烧瓶应用程序构建 docker 映像。该应用程序使用另一个 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 上运行所有这些。任何帮助将不胜感激。

【问题讨论】:

    标签: mysql docker flask docker-compose dockerfile


    【解决方案1】:

    问题是您的 Web 容器在 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):
    

    您可以通过为您的 Web 应用程序引入等待功能来解决此问题,为此将您的 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-entrypoint.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
    

    【讨论】:

    • 如果入口文件以exec "$@"结尾,它可以重用原始Dockerfile中的CMD。如果您想使用相同的初始设置运行其他东西(例如,调试 shell),这是一个有用的模式。
    • @wshihadeh 它继续打印如下日志。也许它无法连接到数据库,你知道吗? web_1 | db:3306 不可用 - 睡眠 web_1 | db:3306: 转发主机查找失败:未知主机
    • 好像web容器无法解析数据库容器名称。 db:3306 是数据库服务名称和端口。你能从你的 docker-compose 验证这些是正确的吗?
    • 按照您在响应中添加的 shell 脚本,我在 MAC 终端 nc -v localhost 3306 上使用以下命令进行了测试,它显示连接到 localhost 端口 3306 [tcp/mysql] 成功!你认为我可以在脚本中替换这个命令来让它工作吗?
    • 在进行上述更改时,我得到以下日志 localhost [127.0.0.1] 3306 (mysql) : Connection denied web_1 | db:3306 不可用 - 正在休眠,容器名称为 datajoint/mysql
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2021-07-20
    • 2021-09-04
    • 2017-10-18
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多