Добавлен Dockerfile на базе Alpine Linux

- Dockerfile с PHP 8.3 и необходимыми расширениями
- Конфигурация БД через переменные окружения: DB_HOST, DB_PORT, DB_CHARSET
- .dockerignore для оптимизации сборки

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-25 03:43:29 +03:00
parent de477c3e64
commit e03c0b2208
3 changed files with 64 additions and 7 deletions

8
.dockerignore Normal file
View File

@@ -0,0 +1,8 @@
.git
.gitignore
.claude
.cursor
*.md
*.bak
vendor
.DS_Store

44
Dockerfile Normal file
View File

@@ -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"]

View File

@@ -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,
]);