Приложение PHP не может подключиться к MariaDB с помощью Docker Compose - PullRequest
0 голосов
/ 12 декабря 2018

Мое приложение настроено с помощью 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 установлена ​​сеть по умолчанию (внешняя).

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Ну, я нашел решение этой проблемы.Тем не менее, это не то, что я ожидал.URL базы данных определяется как:

DATABASE_URL="mysql://dbuser:dbpass@db/dbname"

Он должен быть без кавычек, например:

DATABASE_URL=mysql://dbuser:dbpass@db/dbname

Теперь все, кажется, работает, кто-нибудь знает, когда и почему вы можете и можетене используете кавычки?

0 голосов
/ 12 декабря 2018

Добро пожаловать в stackoverflow:)

Я думаю, что, возможно, он не работает для контейнера БД, не связанного с контейнером phpapp.Можете ли вы попробовать, как это?

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 для имени хоста при подключении к базе данных.

Я надеюсь, что смогу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...