在Docker容器上运行PHINX迁移时出现PDO连接错误

时间:2017-06-18 11:37:07

标签: php mysql docker pdo phinx

我正在尝试使用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"

我的文件夹结构如下:

/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

我尝试过重建图像,试过其他图片,但似乎没有用。我可以使用SequelPro通过以下配置从我的主机连接到Docker MySQL:

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

我需要做什么/修复才能在我的主机上运行MySQL容器上的这些Phinx迁移,因为另一种方法是使用我试图避免的另一个Docker Container

2 个答案:

答案 0 :(得分:1)

您应该使用docker中的网络服务发现功能。你有一个名为' mysql'的服务,因此同一网络上的所有容器都是容器能够通过名称连接到它:' mysql'

0.0.0.0不是您可以连接的实际IP。您在docker ps的输出中看到了这一点,因为这是一个别名,意味着"所有接口"。发布报表时,docker将在主机上设置listen,0.0.0.0表示任何主机接口。

每个容器都有自己的localhost,因此如果您指定localhost,但数据库在另一个容器中运行,则会拒绝连接。

如果您在一个容器中有这样的数据库,并且想要从另一个容器连接到它,则根本不需要使用任何端口发布。端口发布适用于您要从非容器或Docker主机外部访问的服务。这意味着您可以从您的mysql服务的撰写文件中删除报告3306,而您的其他容器仍然可以通过连接到' mysql'来连接到它。主机名。

名称发现服务有效,因为在每个docker容器中,docker在127.0.0.11运行虚拟DNS服务器。任何容器名称或服务名称都可以在该dns服务器上解析。

答案 1 :(得分:0)

正如您所说的,您正在从主机上运行命令,这就是问题所在。首先使用以下命令在终端上登录您的docker容器: docker exec -it {container_id} sh, 然后转到您的项目文件夹并运行phinx命令。 在下面共享phinx.yml文件以供参考- (确保迁移路径应该是您的docker文件夹路径)

路径: 迁移:/ cars / engine / dealerengine / migrations

环境: default_migration_table:phinxlog default_database:码头工人

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