0

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

这是我的码头工人撰写:

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 容器?

4

2 回答 2

1

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

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

每个容器都有自己的本地主机,因此如果您指定本地主机,但数据库在不同的容器中运行,您将收到拒绝连接。

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

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

于 2017-06-19T17:24:29.050 回答
0

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

路径:迁移:/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
于 2020-02-20T05:58:11.513 回答