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

我试图从我的主机(OSX Sierra)使用Phinx进行迁移,但是我不断收到PDO连接错误。 这是一个简单的LAMP堆栈,否则工作正常。

这是我的docker组成:

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 

我试图重build图像,尝试其他图像,但似乎并没有工作。 我可以使用SequelPro通过以下configuration从主机连接到Docker MySQL:

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

我需要做什么/修复,以便从我的主机上运行MySQL容器上的这些Phinx迁移作为替代将使用另一个我试图避免的Docker容器 ?

您应该在Docker中使用networking服务发现function。 你有一个叫做'mysql'的服务,所以同一个networking上的所有容器都是这个容器可以通过名字连接到它:'mysql'

0.0.0.0不是您可以连接的实际IP地址。 你会发现在docker ps的输出中,因为这是一个意思是“所有接口”的别名。 在发布报告时,docker将在主机上设置一个监听,而0.0.0.0表示任何主机接口。

每个容器都有自己的本地主机,所以如果你指定的是localhost,但是数据库运行在不同的容器中,你会得到一个拒绝的连接。

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

名称发现服务工作,因为在每个docker集装箱内,docker运行虚拟DNS服务器在127.0.0.11。 任何容器名称或服务名称将在该DNS服务器上parsing。