我的应用程序是使用Docker Compose设置的。我的docker-compose.yml内容;
version: "3.1"
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
db:
image: mariadb:10.4
restart: always
ports:
- "3307:3306"
volumes:
- ./mysql:/var/lib/mysql
container_name: mariadb
environment:
- MYSQL_DATABASE=dbname
- MYSQL_PASSWORD=dbpass
- MYSQL_RANDOM_ROOT_PASSWORD=yes
- MYSQL_USER=dbuser
phpapp:
depends_on:
- nginx-proxy
- db
image: myhub/myrepo
restart: always
container_name: phpapp
expose:
- 80
- 443
environment:
- APP_ENV=prod
- APP_SECRET="secret"
- CORS_ALLOW_ORIGIN="^.*?$$"
- DATABASE_URL="mysql://dbuser:dbpass@db/dbname"
- VIRTUAL_HOST=phpapp.com
networks:
default:
external:
name: nginx-proxy
但是,当我尝试连接到应用程序中的数据库时,出现一条错误消息。 SQLSTATE[HY000] [2002] No such file or directory
。
但是,我可以使用正确的用户名和密码在本地主机的端口3307上进行连接。另外,当我使用docker exec -ti phpapp /bin/bash
访问容器并运行env
时,我列出了所有环境变量,它们是正确的。
执行docker network inspect nginx-proxy
后,我得到了
[
{
"Name": "nginx-proxy",
"Id": "2529933d7e38cfba34e0e876e43a96fc4c8d7321c1e89048319ba804b00e1026",
"Created": "2018-12-12T05:04:01.9044879Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
容器数组为空,但是在docker-compose.yml中设置了默认(外部)网络。
答案 0 :(得分:2)
欢迎来到stackoverflow:)
我认为也许它不适用于未从phpapp容器链接的db容器。你可以这样尝试吗?
version: "3.1"
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
db:
image: mariadb:10.4
restart: always
ports:
- "3307:3306"
volumes:
- ./mysql:/var/lib/mysql
container_name: mariadb
environment:
- MYSQL_DATABASE=dbname
- MYSQL_PASSWORD=dbpass
- MYSQL_RANDOM_ROOT_PASSWORD=yes
- MYSQL_USER=dbuser
phpapp:
depends_on:
- nginx-proxy
links:
- db
image: myhub/myrepo
restart: always
container_name: phpapp
expose:
- 80
- 443
environment:
- APP_ENV=prod
- APP_SECRET="secret"
- CORS_ALLOW_ORIGIN="^.*?$$"
- DATABASE_URL="mysql://dbuser:dbpass@db/dbname"
- VIRTUAL_HOST=phpapp.com
networks:
default:
external:
name: nginx-proxy
我将db从depends_on移到了链接。现在必须在数据库连接中使用db作为主机名。
希望我能帮上忙。
答案 1 :(得分:0)
好吧,我已经找到了解决此问题的方法。但是,这不是我所期望的。数据库URL定义为:
DATABASE_URL="mysql://dbuser:dbpass@db/dbname"
应该没有引号,例如:
DATABASE_URL=mysql://dbuser:dbpass@db/dbname
现在一切似乎都正常了,有人知道何时,为什么可以使用引号,不能使用引号?