From e03c0b2208329257a0b193581565057e4e8cd3a4 Mon Sep 17 00:00:00 2001 From: Michael Chus Date: Sun, 25 Jan 2026 03:43:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20Dockerfile=20=D0=BD=D0=B0=20=D0=B1=D0=B0=D0=B7=D0=B5?= =?UTF-8?q?=20Alpine=20Linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile с PHP 8.3 и необходимыми расширениями - Конфигурация БД через переменные окружения: DB_HOST, DB_PORT, DB_CHARSET - .dockerignore для оптимизации сборки Co-Authored-By: Claude Opus 4.5 --- .dockerignore | 8 ++++++++ Dockerfile | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/Db.php | 19 ++++++++++++------- 3 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..74f789c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +.gitignore +.claude +.cursor +*.md +*.bak +vendor +.DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9f00952 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,44 @@ +FROM alpine:3.19 + +# Установка PHP и необходимых расширений +RUN apk add --no-cache \ + php83 \ + php83-pdo \ + php83-pdo_mysql \ + php83-session \ + php83-json \ + php83-mbstring \ + php83-openssl \ + php83-phar \ + php83-zlib \ + php83-dom \ + php83-xml \ + php83-tokenizer \ + curl + +# Создаём симлинк php -> php83 +RUN ln -sf /usr/bin/php83 /usr/bin/php + +# Установка Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer + +WORKDIR /app + +# Копируем composer файлы и устанавливаем зависимости +COPY composer.json ./ +RUN composer install --no-dev --optimize-autoloader --no-scripts + +# Копируем исходный код +COPY src/ ./src/ +COPY public/ ./public/ + +# Переменные окружения по умолчанию +ENV DB_HOST=localhost +ENV DB_PORT=3306 +ENV DB_CHARSET=utf8mb4 +ENV PHP_ERROR_DISPLAY=false + +EXPOSE 8080 + +# Запуск встроенного PHP сервера +CMD ["php", "-S", "0.0.0.0:8080", "-t", "public"] diff --git a/src/Db.php b/src/Db.php index 6037a34..982d247 100644 --- a/src/Db.php +++ b/src/Db.php @@ -6,6 +6,15 @@ use PDOException; class Db { + private static function getDsn(): string + { + $host = getenv('DB_HOST') ?: 'localhost'; + $port = getenv('DB_PORT') ?: '3306'; + $charset = getenv('DB_CHARSET') ?: 'utf8mb4'; + + return "mysql:host={$host};port={$port};charset={$charset}"; + } + // Простая фабрика PDO по логину/паролю MariaDB из сессии public static function connectFromSession(): PDO { @@ -16,12 +25,9 @@ class Db $user = $_SESSION['db_user']; $pass = $_SESSION['db_pass']; - // TODO: вынести host/port/charset в конфиг .env - $dsn = 'mysql:host=localhost;port=3306;charset=utf8mb4'; - - $pdo = new PDO($dsn, $user, $pass, [ + $pdo = new PDO(self::getDsn(), $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_EMULATE_PREPARES => false, // важная настройка [web:28][web:25] + PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); @@ -30,9 +36,8 @@ class Db public static function testConnection(string $user, string $pass): void { - $dsn = 'mysql:host=localhost;port=3306;charset=utf8mb4'; // MariaDB совместим [web:22][web:28] try { - new PDO($dsn, $user, $pass, [ + new PDO(self::getDsn(), $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ]);