Ошибка подключения к PDO при запуске миграции PHINX в Docker-контейнере

Я пытаюсь запустить миграцию, используя Phinx, с моей хост-машины (OSX Sierra), но у меня постоянно возникает ошибка соединения с PDO. Это простой стек LAMP и работает нормально в противном случае.

Вот мой docker-compose:

version: '2'
services:
  apache:
    build:
      context: ./docker/apache-php7
      dockerfile: Dockerfile
    volumes:
      - ./app:/var/www
    ports:
      - "80:80"
      - "443:443"
    networks:
     - localnet
    links:
    - mysql
  mysql:
    image: mysql:5.7
    ports:
     - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: "root"
      MYSQL_USER: "root"
      MYSQL_PASSWORD: "root"
    volumes:
     - ./db/mysql:/var/lib/mysql
    networks:
     - localnet
networks:
  localnet:
    driver: "bridge"
volumes:
  mysqldata:
    driver: "local"
  redisdata:
    driver: "local"

Моя папка Strucutre выглядит следующим образом:

/app
/db/mysql
/docker
docker-compose.yml

Мой phinx.yml:

paths:
    migrations: %%PHINX_CONFIG_DIR%%
    seeds: %%PHINX_CONFIG_DIR%%

environments:
    default_migration_table: phinxlog
    default_database: docker
    production:
        adapter: mysql
        host: localhost
        name: %%PHINX_DBNAME%%
        user: %%PHINX_DBUSER%%
        pass: %%PHINX_DBPASS%%
        port: 3306
        charset: utf8

    development:
        adapter: mysql
        host: localhost
        name: %%PHINX_DBNAME%%
        user: %%PHINX_DBUSER%%
        pass: %%PHINX_DBPASS%%
        port: 3306
        charset: utf8

    docker:
        adapter: mysql
        host: mysql
        name: foo_db
        user: root
        pass: root
        port: 3306
        charset: utf8

Вот вывод, который я получаю, когда запускаю команду (php ~/projects/project/app/vendor/bin/phinx migrate) с моего хоста.

using config file ./phinx.yml
using config parser yaml
using migration paths
 - /Users/foo/projects/project/app/migrations
using seed paths
 - /Users/foo/projects/project/app/migrations
warning no environment specified, defaulting to: docker
using adapter mysql
using database foo_db

[InvalidArgumentException]
  There was a problem connecting to the database: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

Я пытался восстановить изображение, пробовал другие изображения, но, похоже, не работает. Я могу подключиться к Docker MySQL с моего хост-компьютера, используя SequelPro со следующей конфигурацией:

 Host: 0.0.0.0
 Username: root
 Password: root
 Databse: 
 Port: 3306

Что мне нужно сделать / исправить для запуска этих миграций Phinx на контейнере MySQL с моей хост-машины, в качестве альтернативы можно было бы использовать другой Docker-контейнер, которого я пытаюсь избежать?

1 ответ

Вы должны использовать функцию обнаружения сетевых служб в Docker. У вас есть служба под названием "mysql", поэтому все контейнеры в одной сети позволяют контейнеру подключаться к ней по имени: "mysql"

0.0.0.0 не является реальным ip, к которому вы можете подключиться. Вы видите, что в выводе docker ps потому что это псевдоним, который означает "все интерфейсы". Когда вы публикуете отчет, Docker настроит прослушивание на хосте, а 0.0.0.0 означает любой интерфейс хоста.

Каждый контейнер получает свой собственный localhost, поэтому, если вы указываете localhost, но база данных работает в другом контейнере, вы получите отказ в соединении.

Если у вас есть база данных, подобная этой, в одном контейнере, и вы хотите подключиться к ней из другого контейнера, вам вообще не нужно использовать публикацию портов. Публикация портов предназначена для служб, к которым вы хотите получить доступ не из контейнера или вне хоста докера. Это означает, что вы можете удалить отчет 3306 из вашего файла compose для вашей службы mysql, а ваш другой контейнер все еще может подключиться к нему, подключившись к имени хоста "mysql".

Служба обнаружения имен работает, потому что внутри каждого контейнера Docker Docker запускает виртуальный DNS-сервер на 127.0.0.11. Любое имя контейнера или имя службы будет разрешаться на этом DNS-сервере.

Как вы сказали, вы запускаете команду со своего хост-компьютера, это проблема. Сначала войдите в свой контейнер докеров на терминале, используя команду: docker exec -it {container_id} sh, затем перейдите в папку проекта и запустите команду phinx. совместное использование файла phinx.yml ниже для справки - (убедитесь, что путь миграции должен совпадать с путем к вашей папке докера)

пути: миграции: /cars/engine/dealerengine/migrations

среды: default_migration_table: phinxlog default_database: docker

production:
    adapter: mysql
    host: localhost
    name: production_db
    user: root
    pass: ''
    port: 3306
    charset: utf8

docker:
    adapter: mysql
    host: mysql
    name: dealerengine
    user: root
    pass: root
    port: 3306
    charset: utf8

testing:
    adapter: mysql
    host: localhost
    name: testing_db
    user: root
    pass: ''
    port: 3306
    charset: utf8
Другие вопросы по тегам