Почему контейнер PHP docker не может найти имя хоста контейнера MYSQL? - PullRequest
0 голосов
/ 17 марта 2020

Я создал и связал php - apache контейнер с MYSQL контейнером. Но когда я пытаюсь установить соединение sh с помощью PDO из файла php, я получаю сообщение об ошибке. Кто-нибудь знает, как это можно исправить? Спасибо.

Ошибка PDO:

Неустранимая ошибка: Uncaught PDOException: PDO :: __ construct (): сбой php_network_getaddresses: getaddrinfo: Имя или служба не известны в / var / www/html/index.php : 3 трассировки стека: # 0 / var / www/html/index.php (3): конструкция PDO -> __ ('mysql: host = mysq ...', 'root', 'root') # 1 { main} Следующее исключение PDO: SQLSTATE [HY000] [2002] php_network_getaddresses: сбой getaddrinfo: имя или служба не известны в / var / www/html/index.php: 3 Трассировка стека: # 0 / var / www/html/index.php (3): конструкция PDO -> __ ('mysql: host = mysq ...', 'root', 'root') # 1 {main} в / var / www/html/index.php в строке 3

Моя структура каталогов:

.
├── mysql
├── php
|   └── Dockerfile
├── src
|   └── index.php
└── docker-compose.yml

Содержимое моего индекса. php:

$connection = new PDO('mysql:host=mysql-db,dbname=app', 'root', 'root');

PHP Dockerfile:

FROM php:7.3.3-apache

RUN docker-php-ext-install -j$(nproc) pdo_mysql

docker - compose.yml:

version: '3'

services:
  apache-php:
    build:
      ./php
    volumes:
      - ./src:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - mysql-db
    links:
      - mysql-db

  mysql-db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - /mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Во-первых, вам не нужно links:, которое будет выполнено автоматически, поскольку обе службы находятся в одной сети.

Во-вторых, depends_on не будет ждать, пока сервер MySQL не будет запущен и работает, и есть вероятность, что служба PHP начнет обмениваться данными до того, как будет готова, и именно поэтому вы получаете эту ошибку.

В таких случаях ИТ-специалистам лучше реализовать функцию «ожидания» для вашего PHP сервис.

для этого вам нужно добавить точку входа в вашу PHP услугу и код, подобный этому

docker file

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

docker -entrypoint . sh

#!/bin/sh -e
until nc -vz mysql-db:3306 > /dev/null; do
    >&2 echo "mysql-db:3306 is unavailable - sleeping"
    sleep 2
  done
  >&2 echo "mysql-db is up"

exec "YOUR COMMAND"
exit 0
0 голосов
/ 19 марта 2020

В конце концов, выясните, что в моем коде php вместо определения точки с запятой вместо запятой стоит запятая. Мои извинения.

0 голосов
/ 19 марта 2020

У меня было 2 проблемы:

1) php: apache изображениям нужно много работать для запуска php приложений, лучше просто сделать свое собственное, я сделал свое из Ubuntu 18:04 image

2) Я не помню почему, но необходимо установить mysql, чтобы разрешить mysql_native_passwords для работы (в моем случае) php

Вот файл docker -compose, который я сделал для теста в классе (т. Е. Тег examen), чтобы поделиться своим веб-приложением:

version: '3'
services:

  app:
    image: gnomejodas/httpd-php:examen
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html
    links:
      - db

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./db:/var/lib/mysql

PD. Я супер-новичок ie разработчик (все еще учусь), пожалуйста go спокойно на меня.

РЕДАКТИРОВАТЬ. Если вы создаете свой собственный образ, не забудьте CMD apachectl -D FOREGROUND, чтобы ваша служба apache запускалась при запуске контейнера.

...