Solucionado (ver solução)
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!