MYSQL: подключение как к localhost, так и к host.docker.internal

#mysql #docker #sequelize.js

#mysql #docker #sequelize.js

Вопрос:

Я должен подключиться как к localhost, так и к docker.

 const db = new Sequelize({
  host : 'host.docker.internal'| process.env.DB_HOST,
  database: process.env.DB_NAME,
  username: process.env.DB_USER,
  password: process.env.DB_PASS,
  dialect: 'mysql'
})
 

В следующем коде, когда я запускаю
node app.js он работает на компьютере. Но когда я запускаю docker run -p 3000:3000 [imagehash] его, он выдает следующую ошибку

ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306

и когда я запускаю

 const db = new Sequelize({
  host : 'host.docker.internal',
  database: process.env.DB_NAME,
  username: process.env.DB_USER,
  password: process.env.DB_PASS,
  dialect: 'mysql'
})
 

он отлично работает на docker run -p 3000:3000 [imagehash]

Как работать на обоих отлично

ПРИМЕЧАНИЕ : process.env.DB_HOST = localhost

Ответ №1:

Когда вы создаете информацию о подключении к базе данных, сначала проверьте переменную среды. Часто бывает полезно установить в качестве резервного значения то, что вы хотели бы видеть в своей повседневной среде разработки.

 const db = new Sequelize({
  host: process.env.DB_HOST || 'localhost',
  ...
});
 

Затем, когда вы запускаете его в Docker, вам необходимо указать значение этой переменной среды.

 # If the database isn't in a container
docker run -e DB_HOST=host.docker.internal -p 3000:3000 myapp
 
 # If the database is in a container; typical Compose setup
version: '3.8'
services:
  app:
    build: .
    environment:
      - DB_HOST=db # matching the name of the service below
    ports:
      - 3000:3000
  db:
    image: mysql
    volumes:
      mysql_data: /var/lib/mysql/data
volumes:
  mysql_data:
 

Ответ №2:

Я думаю, вы пытаетесь подключиться к базе данных mysql, которая работает на хосте, чтобы заставить ее работать, просто добавьте --network host аргумент в свою команду run. соответствующая документация

После этого лучше всего создать базу данных mysql внутри контейнера и связать ее с вашим приложением