[英]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.