Mi docker-compose.yml se ve así:
version: '3' services: api: build: context: . dockerfile: Dockerfile image: api container_name: app-api restart: unless-stopped env_file: ./.env ports: - '8080:8080' volumes: - ./src - ./node_modules command: yarn start depends_on: - mysql mysql: container_name: app-mysql restart: always image: mysql:8.0.21 environment: MYSQL_ROOT_PASSWORD: 'root' MYSQL_USER: 'app' MYSQL_PASS: 'password' MYSQL_DATABASE: 'appdb' volumes: - ./data:/var/lib/mysql ports: - '3307:3306' Mi .env se ve así:
DB_HOST="mysql" // Tried 127.0.0.1, 0.0.0.0 DB_PORT="3306" DB_USER="app" DB_PASSWORD="password" DB_NAME="appdb" NODE_ENV="DEV" Error que recibo del servicio: {"message":"Database connection failed with error Error: getaddrinfo ENOTFOUND \"mysql\"","level":"info","timestamp":"2020-07-27T03:57:55.524Z"}
Puedo conectarme con root desde MySQL Workbench, no puedo conectarme con la app de usuario. Si la API se inicia sin estar en un contenedor docker, puede conectarse a la base de datos local.
Parece que simplemente no puede resolver el host en absoluto, ¿es un problema de DNS? No recuerdo si tuve el mismo problema cuando mysql no estaba acoplado, pero no podía conectarse a una base de datos que está fuera de un contenedor. Qué estoy haciendo mal.
Editar: comentar todo el servicio mysql no tiene ningún impacto, el mensaje de error es el mismo.
Creé un servicio API más simple para probar la configuración: funciona correctamente. Debe haber sido algo con la API repetitiva que estaba usando.
Si alguien está mirando, cosas que descubrí:
host.docker.internal en lugar de 127.0.0.1 o mysql funciona: se conecta a un servidor db en su máquina../data en realidad no estaba vacía, parece que mysql descargó todas sus cosas allí.Docker interpreta las comillas dobles en un archivo .env de manera diferente a un sistema Unix. Específicamente, las comillas dobles se consideran parte de la cadena.
https://docs.docker.com/compose/env-file/
No hay un manejo especial de las comillas. Esto significa que son parte del VAL.
Elimine las comillas en su archivo .env y estará bien.
Tenía el mismo problema. Estoy usando Docker Secrets a través de docker-compose para cargar el host mysql en mi aplicación Node y tenía una nueva línea al final de mi archivo secreto para el nombre de host mysql.
... Entonces, en caso de que esté utilizando Docker Secrets, es posible que desee verificar si hay una nueva línea no deseada al final de su archivo secreto.