#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