我试图从我的主机(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"
我的文件夹strucutre如下:
/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 migration)时得到的输出。
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?
最佳答案
您应该在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服务器上解析。
关于php - 在Docker容器上运行PHINX迁移时发生PDO连接错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44614564/