Answer a question

I'm getting this error when running docker-compose up and I don't know why, tried researching it but all the solutions that I found didn't work. If any knows it would be awesome if you can share it. Thanks!

ERROR

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'mysql' ([Errno -2] Name or service not known)")

This is my docker-compose.yml file. It has the 2 images that it needs to build.

docker-compose.yml

version: "3.7"

services:
  web:
    build: .
    depends_on:
      - mysql
    ports:
      - 5000:5000
    links:
      - mysql
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: 12345678
      MYSQL_DB: flaskmysql
  mysql:
    image: mysql:5.7
    ports:
      - "32000:3306"
    volumes:
      - ./mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_DATABASE: flaskmysql
volumes:
  mysql-data:

This is my Dockerfile that has all the steps to run my application.

Dockerfile

FROM python:3.9-slim-buster

RUN apt-get update && apt-get install -y git python3-dev gcc gfortran libopenblas-dev liblapack-dev \
    && rm -rf /var/lib/apt/lists/* 

COPY requirements.txt .

RUN pip install --upgrade -r requirements.txt

COPY app app/

RUN python app/server.py

EXPOSE 5000

CMD ["python", "app/server.py", "serve"]

Here I've got the lines of code that tries to make a connection to the service that docker-compose created with the image given.

Server.py

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']= 'mysql+pymysql://root:12345678@mysql:3306/flaskmysql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']= False

Answers

I believe you are running into a race condition here. Even though you've specified the depends_on dependency for your application, note that docker-compose will not 'wait' for the database to be available before proceeding to the next step. That is because docker-compose doesn't "know" what it means for this service to become "ready".

This mean, as long as the container is 'Running' (can be still initialising the database), docker-compose will move on to try and build the image for your application, and running the application, which attempts to connect with a database not ready. You can do two things here:

  1. Add a waiting loop in your application to attempt retries. RECOMMENDED.
  2. Add a solution like wait-for-it to your docker compose setup.

You can find more details in this docker documentation page on startup order setting.

I suggest add a simple retry loop in your application :)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐