Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Erro nas migrations do projeto

opa, estou com um problema na execução desse comando:

  • docker-compose run web python manage.py makemigrations

o erro basicamente é ... 'decouple.UndefinedValueError: SECRET_KEY not found. Declare it as envvar or define a default value'.

11 respostas

Olá Mateus, tudo bem? Você poderia colocar aqui o log completo do erro? E também colocar o conteúdo do seu arquivo docker-compose.yml e também do seu arquivo env? Pra gente poder verificar corretamente, de ante mão, o seu arquivo env deve está da seguinte forma:

[config]
# Secret configuration
SECRET_KEY = <hash-aqui>

# conf
DEBUG=True

# Database
DB_NAME = "todo_dev"
DB_USER = "devops_dev"
DB_PASSWORD = "mestre"
DB_HOST = "db"
DB_PORT = "3309"

Fico aguardando retorno!

  • Erro completo:

Traceback (most recent call last): File "manage.py", line 15, in 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 325, in execute settings.INSTALLED_APPS File "/usr/local/lib/python3.6/site-packages/django/conf/init.py", line 57, in getattr self.setup(name) File "/usr/local/lib/python3.6/site-packages/django/conf/init.py", line 44, in _setup self.wrapped = Settings(settings_module) File "/usr/local/lib/python3.6/site-packages/django/conf/init.py", line 107, in init mod = importlib.import_module(self.SETTINGS_MODULE) File "/usr/local/lib/python3.6/importlib/init.py", line 126, in import_module return bootstrap.gcd_import(name[level:], package, level) File "", line 994, in gcdimport File "", line 971, in findand_load File "", line 955, in findand_load_unlocked File "", line 665, in loadunlocked File "", line 678, in exec_module File "", line 219, in callwith_frames_removed File "/usr/src/app/to_do/settings.py", line 25, in SECRET_KEY = config('SECRET_KEY') File "/usr/local/lib/python3.6/site-packages/decouple.py", line 197, in call return self.config(args, **kwargs) File "/usr/local/lib/python3.6/site-packages/decouple.py", line 85, in call return self.get(args, **kwargs) File "/usr/local/lib/python3.6/site-packages/decouple.py", line 70, in get raise UndefinedValueError('{} not found. Declare it as envvar or define a default value.'.format(option)) decouple.UndefinedValueError: SECRET_KEY not found. Declare it as envvar or define a default value.

  • arquivo docker-compose.yml

version: '3'

services: db: image: mysql:5.7 ports:

  - '3309:3306'
environment:
   MYSQL_DATABASE: 'todo_dev'
   MYSQL_USER: 'devops_dev'
   MYSQL_PASSWORD: 'mestre'
   MYSQL_ROOT_PASSWORD: 'senha'

web: image: jnlucas/minha-imagem:latest volumes:

  - ./env:/usr/src/app/to_do/.env
ports:
  - "8009:8000"
depends_on:
  - db

Mateus, o erro na verdade é no Python, ele não está conseguindo encontrar o valor da variável SECRET_KEY que é definada no arquivo env, porém vi que alguns problemas estavam relacionados a porta do MySQL, sendo assim você poderia colocar o bind de portas do MySQL para 3306:3306 deixando o arquivo da seguinte forma:

version: '3'

services:
  db:
    image: mysql:5.7
    ports:
      - '3306:3306'
    environment:
       MYSQL_DATABASE: 'todo_dev'
       MYSQL_USER: 'devops_dev'
       MYSQL_PASSWORD: 'mestre'
       MYSQL_ROOT_PASSWORD: 'senha'
  web:
    image: aluracursos/django_todolist_image_build
    volumes:
      - ./env:/usr/src/app/to_do/.env
    ports:
      - "8000:8000"
    depends_on:
      - db

E também alterar a porta no arquivo env ficando da seguinte forma:

[config]
# Secret configuration
SECRET_KEY = 'r*5ltfzw-61ksdm41fuul8+hxs$86yo9%k1%k=(!@=-wv4qtyv'

# conf
DEBUG=True

# Database
DB_NAME = "todo_dev"
DB_USER = "devops_dev"
DB_PASSWORD = "mestre"
DB_HOST = "db"
DB_PORT = "3306"

E altera o nome do arquivo env para .env.

E fala pra gente o resultado!

Opa Jonilson blz? Infelizmente o erro persiste mesmo após trocar de porta e renomear a .env :/

Vi em outro tópico que você está usando o WSL (Windows for Linux) para fazer o curso correto? Como posteriormente será necessário usar o docker in docker, acho que pode não ser viável concluir os estudos usando o WSL. Recomendo fortemente a utilização de algum sistema Linux como mencionei no outro tópico.

Boa Noite Jonilson,No caso acredito que nesse problema não esteja relacionado ao WSL, consegui resolver o problema acima, porém acusou um outro erro encadeado, ligado ao HOST da qual estou tentando acessar meu banco, segue o seguinte trecho do erro:

  • 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: (2005, "Unknown MySQL server host 'mysql' (-5)")

No caso quando eu tiro o DB_HOST do .gitlab-ci.yml ele acusa erro na variável DB_HOST="db", configurada na .env. Fora isso não entendi muito bem o do porque configurar no arquivo .gitlab-ci.yml como DB_HOST='mysql' e seguir a mesma referência para ela no .env porém com valor diferentes, no caso o DB apontando para o container no gitlab-ci.yml. Não seria viável colocar DB_HOST='db' também no .gitlab-ci.yml como configuração?

Que legal que conseguiu resolver o outro problema. Bem sobre isso é bastante estranho mesmo, porém essa variável DB_HOST é que a aplicação Python vai utilizar e sobre escreve a variável DB_HOST do arquivo env, e porque colocamos o nome mysql no gitlab-ci.yml é porque o container criado terá esse nome. No caso quando você coloca DB_HOST: 'mysql' no arquivo gitlab-ci.yml é que é retornado esse erro? E qual é a imagem que você está utilizando no gitlab-ci.yml? Eu sugiro você fazer o build da sua imagem, depois subir pro Docker Hub e usar a sua própria imagem, acho que isso deve corrigir.

Bom dia Jonilson, bom notei que aqui você está utilizando

  • image: aluracursos/django_todolist_image_build, para tentar resolver o problema certo?

Porém no curso ele pede para criar nossa própria imagem, no caso o que foi que eu fiz, até mesmo para configurar o runner do gitlab, enfim vou passar o estado dos meus arquivos atualmente:

* gitlab-ci.yml 
image: docker:stable

stages:
- pre-build
- build
- test
- deploy

build-docker:
  services:
  - docker:dind

  before_script:
  - docker info
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD

  stage: pre-build
  script:
  - docker build -t minha-imagem .
  - docker tag minha-imagem msant0/minha-imagem:latest
  - docker push msant0/minha-imagem:latest

build-project:
  image: msant0/minha-imagem:latest
  services:
  - docker:dind
  - mysql:5.7
  variables:
    MYSQL_USER: $DB_USER
    MYSQL_PASSWORD: $DB_PASSWORD
    MYSQL_DATABASE: $DB_DATABASE
    MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD

    DB_NAME: $DB_DATABASE
    DB_USER: $DB_USER
    DB_PASSWORD: $DB_PASSWORD
    DB_PORT: '3306'
    DB_HOST: mysql
    SECRET_KEY: $DB_SECRET_KEY
  stage: build
  image: msant0/minha-imagem:latest
  tags:
  - runner-build
  dependencies:
  - build-docker
  script:
  - python manage.py makemigrations
  - python manage.py migrate

test-project:
  stage: test
  services:
  - docker:dind
  - mysql:5.7
  variables:
    MYSQL_USER: $DB_USER
    MYSQL_PASSWORD: $DB_PASSWORD
    MYSQL_DATABASE: $DB_DATABASE
    MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD

    DB_NAME: $DB_DATABASE
    DB_USER: $DB_USER
    DB_PASSWORD: $DB_PASSWORD
    DB_PORT: '3306'
    DB_HOST: 'db'
    SECRET_KEY: $DB_SECRET_KEY
  dependencies:
  - build-project
  tags:
  - runner-build
  script:
  - python -m unittest setUp
* .env

[config]
# Secret configuration
SECRET_KEY = 'r*5ltfzw-61ksdm41fuul8+hxs$86yo9%k1%k=(!@=-wv4qtyv'

# conf
DEBUG=True

# Database
DB_NAME = "todo_dev"
DB_USER = "devops_dev"
DB_PASSWORD = "mestre"
DB_HOST = "db"
DB_PORT = "3306"
*docker-compose.yml
version: '3'

services:
  db:
    image: mysql:5.7
    ports:
      - '3306:3306'
    environment:
       MYSQL_DATABASE: 'todo_dev'
       MYSQL_USER: 'devops_dev'
       MYSQL_PASSWORD: 'mestre'
       MYSQL_ROOT_PASSWORD: 'senha'
  web:
    image: aluracursos/django_todolist_image_build
    volumes:
      - ./env:/usr/src/app/to_do/.env
    ports:
      - "8000:8000"
    depends_on:
      - db
  • Seguindo a criação dos arquivos atuais, você poderia ter uma ideia porque ele não está encontrando esse host do Mysql? Agradecendo desde já!

Bem Mateus, sobre o seu arquivo gitlab-ci.yml, tenho algumas considerações, primeiro acho que você deve usar a imagem docker:19.03.0 e docker:19.03.0-dind, pra evitar um erro posterior, que até já respondi alguns tópicos com esse erro. Outra coisa, que não sei se esse é o motivo do problema é que no seu build-project você colocou a image duas vezes, então remove uma tenta novamente. E eu também utilizei uma imagem que eu mesmo criei, só não fiz isso no passo para executar o docker-compose. Tenta usando esse código no arquivo gitlab-ci.yml:

image: docker:19.03.0

stages:
- pre-build
- build
- test
- deploy

build-docker:
  services:
  - docker:19.03.0-dind

  before_script:
  - docker info
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD

  stage: pre-build
  script:
  - docker build -t minha-imagem .
  - docker tag minha-imagem msant0/minha-imagem:latest
  - docker push msant0/minha-imagem:latest

build-project:
  image: msant0/minha-imagem:latest
  services:
  - docker:19.03.0-dind
  - mysql:5.7
  variables:
    MYSQL_USER: $DB_USER
    MYSQL_PASSWORD: $DB_PASSWORD
    MYSQL_DATABASE: $DB_DATABASE
    MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD

    DB_NAME: $DB_DATABASE
    DB_USER: $DB_USER
    DB_PASSWORD: $DB_PASSWORD
    DB_PORT: '3306'
    DB_HOST: mysql
    SECRET_KEY: $DB_SECRET_KEY
  stage: build
  tags:
  - runner-build
  dependencies:
  - build-docker
  script:
  - python manage.py makemigrations
  - python manage.py migrate

test-project:
  stage: test
  services:
  - docker:dind
  - mysql:5.7
  variables:
    MYSQL_USER: $DB_USER
    MYSQL_PASSWORD: $DB_PASSWORD
    MYSQL_DATABASE: $DB_DATABASE
    MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD

    DB_NAME: $DB_DATABASE
    DB_USER: $DB_USER
    DB_PASSWORD: $DB_PASSWORD
    DB_PORT: '3306'
    DB_HOST: 'db'
    SECRET_KEY: $DB_SECRET_KEY
  dependencies:
  - build-project
  tags:
  - runner-build
  script:
  - python -m unittest setUp

E fala pra gente o resultado!

Mesmo com os ajustes, está apresentando o seguinte erro:

  • django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'mysql' (-5)")

Verifiquei os arquivos do curso e está exatamente a mesma configuração no DB_HOST, já estou perdendo um pouco as esperanças com esse curso :/

solução!

Consegui resolver o erro na pipeline, por tentativa e erro coloquei o DB_HOST na .env como 'mysql' e ele não reclamou no stage de build. Mesmo assim ficando diferente do que foi passado pelo instrutor!