Подключитесь к MySQL в контейнере Docker, используя Python - PullRequest
0 голосов
/ 22 мая 2019

Я использую pony.orm для подключения к mysqldb, используя код Python:

db.bind(provider='mysql', user=username, password=password, host='0.0.0.0', database=database)

И когда я пишу файл составления докера:

  db:
    image: mariadb
    ports:
      - "3308:3306"
    environment:
      MYSQL_DATABASE: db
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: ''

Как передать имя хоста программе python, указав значение (в среде :) в файле docker-compose.yml?

Если я передам значение, я смогу получить доступ к значению через os.environ ['PARAM'] в коде Python?

1 Ответ

1 голос
/ 22 мая 2019

Поскольку вы назвали свой сервис db в docker-compose.yaml, вы можете использовать его как host, если вы находитесь в той же сети:

db.bind(provider='mysql', user=username, password=password, host='db', database=database)

Чтобы убедиться, что вы находитесь в этой сети, в вашем docker-compose.yaml внизу вам понадобится:

networks:
  default:
    external:
      name: <your-network>

И вам нужно будет создать эту сеть перед запуском docker-compose up

docker network create <your-network>

Это позволяет избежать необходимости в переменной среды, поскольку имя контейнера будет добавлено в таблицу маршрутизации сети.

Вам не нужно требовать для определения собственной сети, поскольку docker-compose будет обрабатывать это для вас, но если вы предпочитаете быть немного более явным, это позволяет вам сделать это гибче. Обычно вы резервируете это для нескольких составных решений, которые вы хотите объединить в одной сети, что здесь не так.

Он обрабатывается в docker-compose так же, как вы делаете это в ванили docker:

docker run -d -p 3308:3306 --network <your-network> --name db mariadb
docker run -it --network <your-network> ubuntu bash

# in the shell of the ubuntu container
apt-get update && apt-get install iputils-ping -y
ping -c 5 db

# here you will see the results of ping reaching container db
5 packets transmitted, 5 received, 0% packet loss, time 4093ms

Редактировать

Как примечание, согласно комментарию @ DavidMaze, порт, с которым вы будете связываться, это 3306, поскольку это порт, который прослушивает контейнер, а не 3308.

...