Приложение Docker не может подключиться к базе данных после обновления

#php #mysql #docker #symfony

Вопрос:

в моей компании у меня есть старое приложение Symfony, работающее в контейнере-докере. Это приложение подключено к базе данных SQL, которая также работает в контейнере Docker.

Изображение было построено на php:7.2-apache-stretch, который больше не доступен. Symfony была версией 3.2

Я пытался обновить изображение, но теперь приложение больше не может подключиться к базе данных. Когда я пытаюсь получить хранилище, я получаю сообщение об ошибке: An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused в файле /vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php

Это часть старого файла Dockerfile:

 FROM php:7.2-apache-stretch
.
.
RUN chown -R www-data:www-data /srv/test
    amp;amp; apt-get update 
    amp;amp; apt-get -y install libpng-dev libjpeg-dev unzip
    amp;amp; docker-php-ext-install -j$(nproc) mbstring mysqli pdo pdo_mysql shmop zip gd 
    amp;amp; a2enmod rewrite ssl socache_shmcb 
    amp;amp; service apache2 restart 
        amp;amp; composer install 
    amp;amp; chown -R www-data:www-data /srv/test
    amp;amp; useradd -rm -d /home/test-s /bin/bash -g root -G sudo -u 503 test
 

а это мой новый файл Dockerfile:

 FROM composer:latest AS composer
FROM php:7.4.20-apache


COPY --chown=33:33 . /srv/test
COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf
COPY .docker/php.ini /usr/local/lib/
COPY .docker/php.ini /usr/local/lib/php
COPY .docker/php.ini /usr/local/etc/php

WORKDIR /srv/test

ENV COMPOSER_ALLOW_SUPERUSER 1

COPY --from=composer /usr/bin/composer /usr/bin/composer

RUN chown -R www-data:www-data /srv/test

RUN apt-get update amp;amp; apt-get install -y 
        libfreetype6-dev 
        libjpeg62-turbo-dev 
        libpng-dev 
        libzip-dev 
                zip 
    amp;amp; docker-php-ext-configure gd 
    amp;amp; docker-php-ext-install -j$(nproc) gd 
    amp;amp; docker-php-ext-install pdo_mysql 
    amp;amp; docker-php-ext-install mysqli 
    amp;amp; docker-php-ext-install zip 
    amp;amp; docker-php-source delete 
    amp;amp; useradd -rm -d /home/test-s /bin/bash -g root -G sudo -u 503 test
    amp;amp; pecl install xdebug 
    amp;amp; apt install nano 
    amp;amp; docker-php-ext-enable xdebug
RUN a2enmod rewrite
RUN service apache2 restart
RUN composer install
 

Мой докер-compose.yml

 version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: test-docker
    ports:
      - 8080:80
    links:
      - mysql
    volumes:
      - .:/srv/test
    environment:
      PHP_IDE_CONFIG: 'serverName=localhost'
      XDEBUG_SESSION: 'PHPSTORM'
      XDEBUG_MODE: 'debug'
  mysql:
    image: mysql:8.0.25
    container_name: test_mysql
    volumes:
      - .docker/mysql/init:/docker-entrypoint-initdb.d
    restart: always
    ports:
      - 13306:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
 

композитор.json

 {
    "name": "testapp",
    "license": "proprietary",
    "type": "project",
    "autoload": {
        "psr-4": {
            "": "src/"
        },
        "classmap": [ "app/AppKernel.php", "app/AppCache.php" ,"lib/googleWallet"]

    },
    "autoload-dev": {
        "psr-4": { "Tests\": "tests/" }
    },
    "require": {
        "php": ">=7.0.33",
        "symfony/symfony": "v3.4.49",
        "doctrine/orm": "^2.5",
        "doctrine/doctrine-bundle": "^1.6",
        "doctrine/doctrine-cache-bundle": "^1.2",
        "symfony/monolog-bundle": "^3.0",
        "sensio/distribution-bundle": "^5.0",
        "sensio/framework-extra-bundle": "^3.0.2",
        "incenteev/composer-parameter-handler": "~2.0",
        "jms/serializer-bundle": "^1.1.0",
        "lexik/jwt-authentication-bundle": "^1.4",
        "knplabs/knp-snappy-bundle": "1.4",
        "h4cc/wkhtmltopdf-amd64": "^0.12.3",
        "iio/libmergepdf": "~3.0",
        "justinrainbow/json-schema": "^5.0",
        "symfony/swiftmailer-bundle": "^2.4",
        "doctrine/doctrine-fixtures-bundle": "^2.3",
        "sensio/generator-bundle": "^3.0",
        "phpseclib/phpseclib": "^2.0",
        "pkpass/pkpass": "^1.2",
        "endroid/qr-code": "^2.5",
        "ext-json": "*",
        "google/apiclient": "^2.2",
        "ext-pdo": "*",
        "ext-ctype": "*",
        "ext-curl": "*",
        "aws/aws-sdk-php": "^3.149",
        "symfony/orm-pack": "^2.1"
    },
    "require-dev": {
        "symfony/phpunit-bridge": "^3.0",
        "behat/behat": "~3.1@dev",
        "behat/mink-extension": "~2.2.0",
        "behat/mink-goutte-driver": "~1.2.0",
        "behat/mink-selenium2-driver": "~1.3.0",
        "phpunit/phpunit": "^7",
        "nelmio/alice": "2.*",
        "leaphub/phpcs-symfony2-standard": "~2.0.0"
    },
    "scripts": {
        "post-install-cmd": [
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFile",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::prepareDeploymentTarget"
        ],
        "post-update-cmd": [
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFile",
            "Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::prepareDeploymentTarget"
        ]
    },
    "config": {
        "platform": {
            "php": "7.4.19"
        }
    },
    "extra": {
        "symfony-app-dir": "app",
        "symfony-bin-dir": "bin",
        "symfony-var-dir": "var",
        "symfony-web-dir": "web",
        "symfony-tests-dir": "tests",
        "symfony-assets-install": "relative",
        "incenteev-parameters": {
            "file": "app/config/parameters.yml"
        },
        "branch-alias": {
            "dev-master": "3.0-dev"
        }
    }
}
 

Комментарии:

1. Вы случайно также не обновили свой образ mysql? Похоже, вы используете mysql 8, который принципиально отличается от предыдущих версий тем, что использует другой метод аутентификации. Вы можете изменить плагин аутентификации обратно, используя «—default-authentication-plugin=mysql_native_password», указанный в качестве команды для вашего контейнера mysql.

2. Большое спасибо! Но старое изображение было mariadb:10.4.4. Также было построено изображение со старой версией, но ошибка все еще там

3. Судя по вашему другому вопросу, конфигурация вашей базы данных, похоже, указывает на 127.0.0.1. Однако она должна указывать mysql , поскольку это имя хоста контейнера базы данных.

4. Я использовал все комбинации. Другое название, другой порт. Доктрина не может подключиться к контейнеру, но я могу подключиться через DataGrip