簡體   English   中英

在 Docker 容器上運行 PHINX 遷移時出現 PDO 連接錯誤

[英]PDO connection error when running PHINX migration on a Docker Container

我正在嘗試使用 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 容器

您應該使用 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 服務器上解析。

正如您所說,您正在從主機運行命令,這就是問題所在。 首先使用以下命令在終端上登錄您的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM