5
respostas

Erro ao rodar o comando "docker-compose run web python manage.py makemigrations"

Estou com um erro na execução do comando de migrações iniciais do container. Acontece um erro de conexão via socket com o MySQL, conforme final do log colado abaixo. Pode me ajudar com isso?

Conferi e o serviço do mysql está rodando. Eu consigo conectar no banco apartir do host local via comando 'mysql -h 127.0.0.1 -P 3306 -u root -psenha' ou 'mysql -h 127.0.0.1 -P 3306 -u devops_dev -pmestre'.

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/commands/makemigrations.py", line 103, in handle
    loader.check_consistent_history(connection)
  File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 281, in check_consistent_history
    applied = recorder.applied_migrations()
  File "/usr/local/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 61, in applied_migrations
    if self.has_table():
  File "/usr/local/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 44, in has_table
    return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 255, in cursor
    return self._cursor()
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 232, in _cursor
    self.ensure_connection()
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 194, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 227, in get_new_connection
    return Database.connect(**conn_params)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/__init__.py", line 84, in Connect
    return Connection(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 164, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError: (2002, 'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (2 "No such file or directory")')

Como busca de solução, entrei no container bytebank_web, criei o arquivo "/var/run/mysqld/mysqld.sock na mão" e executei o comando 'python manage.py makemigrations'. Nesse caso o erro foi ligeiramente diferente:

  ...
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/__init__.py", line 84, in Connect
    return Connection(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 164, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError: (2002, 'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused")')

Meus recursos se esgotaram. Alguma sugestão? Não consigo prosseguir com o curso com esse problema.

Obs: Estou tentando executar isso em uma máquina corporativa, com proxy e tudo mais. Não sei se isso deveria interferir. Eu tenho uma instalação local do mysql server mas sempre encerro o serviço quando vou fazer o curso.

Obrigado.

5 respostas

Oi, Ebenézer!

Tive esse mesmo problema e resolvi assim:

Criei uma pasta com permissão total onde ficaria o sock to MySQL, e seria compartilhada com o web:

$ mkdir mysqld && chmod -R 777 mysqld

O docker-compose.yml ficou assim:

services:
  db:
    ...
    volumes:
      - /home/matheus/Documents/Alura/gitlab-ci/mysqld:/var/run/mysqld
  web:
    ...
    volumes:
      - .env:/usr/src/app/to_do/.env
      - /home/matheus/Documents/Alura/gitlab-ci/mysqld:/var/run/mysqld
    ...

Lembre-se de alterar o diretório para o seu caso.

também estou com esse problema, fiz esta solução mas o problema persiste. A impressão e que o container web tenta conectar no mysql localmente mas o serviço esta rodando em outro container e por isso da o erro.

Olá Ebenézer, tudo bem? É o problema está no arquivo mysqld.sock, que deve está localizado dentro da pasta /var/run/mysqld/. Você realizou os passos que o Matheus falou? Esse é um erro comum do MySQL, sempre que não existe esse arquivo mysqld.sock não conseguimos conectar, e caso exista o arquivo mais não mais não as permissões corretas também temos o mesmo erro. Pode disponibilizar o código do seu arquivo de docker-compose.yml pra gente poder analisar outras soluções?

Verifiquei a solução proposta pelo Matheus e funciona tranquilamente, porém é preciso criar a pasta mysqld no mesmo diretório em que está o arquivo docker-compose.yml e precisamos reconstruir os container, por tanto precisamos executar o comando:

docker-compose down

E depois criar os container novamente:

docker-compose up --build

E continuar a sequência de passos proposta na atividade:

Vamos parar a execução dos containers com o atalho de teclado:

ctrl c

Depois vamos subir os containers em modo dettach:

docker-compose up -d

E por executar os comandos para criar as migrations e o usuário:

 docker-compose run web python manage.py makemigrations
 docker-compose run web python manage.py migrate
 docker-compose run web python manage.py createsuperuser

Tentem esse passo a passo, deve funcionar corretamente!

Pessoal, uma outra alternativa pra resolver esse problema é colocar as portas do MySQL pra a porta padrão:

ports:
      - '3306:3306'

E também colocar a porta padrão do MySQL no arquivo env na raiz do projeto, ficando assim:

DB_PORT = "3306"

Isso, porque o MySQL sempre por padrão já realizar o EXPOSE da porta e por algum motivo a aplicação não está conseguindo encontrar o MySQL em outra porta diferente da porta padrão "3306".