Я попытался создать контейнер для приложения PHP-apache с помощью MariaDB и PhpMyAdmin и получил ошибку:
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'cinema.movies' doesn't exist in /var/www/html/app/DAO/MovieDAO.php:14 Stack trace: #0 /var/www/html/app/DAO/MovieDAO.php(14): PDOStatement->execute() #1 /var/www/html/app/Controllers/MovieController.php(16): App\DAO\MovieDAO->getAllMovies() #2 /var/www/html/resources/Views/home.php(5): App\Controllers\MovieController->getAllMovies() #3 /var/www/html/index.php(67): include_once('/var/www/html/r...') #4 {main} thrown in /var/www/html/app/DAO/MovieDAO.php on line 14
и если я попытаюсь перейти на порт 8081 (PMA), я получу сообщение об ошибке, что у меня нет доступа.
Я не могу понять, почему у меня нет доступа к базе данных или почему кажется, что база данных не существует.
Мой файл yml:
services:
web:
image: php:8.2.18-apache
container_name: cinema
build: .
ports:
- "8080:80"
environment:
MYSQL_HOST: $(DB_HOST)
MYSQL_DATABASE: $(DB_NAME)
MYSQL_USER: $(DB_USER)
MYSQL_PASSWORD: $(DB_PASS)
volumes:
- .:/var/www/html
depends_on:
- db
env_file:
- .env
networks:
- app-network
db:
image: mariadb:10.4.32
container_name: database
restart: always
environment:
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: "1"
MYSQL_HOST: $(DB_HOST)
MYSQL_DATABASE: $(DB_NAME)
MYSQL_USER: $(DB_USER)
MYSQL_PASSWORD: $(DB_PASS)
MARIADB_AUTO_UPGRADE: "1"
volumes:
- db_data:/var/lib/mysql
- ./cinema.sql:/docker-entrypoint-initdb.d/cinema.sql
env_file:
- .env
networks:
- app-network
phpmyadmin:
image: phpmyadmin:5.2.1
container_name: phpmyadmin
restart: always
environment:
PMA_HOST: $(DB_HOST)
PMA_USER: $(DB_USER)
PMA_PASSWORD: $(DB_PASS)
ports:
- "8081:80"
depends_on:
- db
env_file:
- .env
networks:
- app-network
volumes:
db_data:
networks:
app-network:
driver: bridge
И Dockerfile:
FROM php:8.2.18-apache
WORKDIR /var/www/html
RUN apt-get update && apt-get install -y \
curl \
git \
zip \
unzip \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libonig-dev \
libxml2-dev \
libzip-dev && \
docker-php-ext-configure gd --with-freetype --with-jpeg && \
docker-php-ext-install -j$(nproc) gd && \
docker-php-ext-install -j$(nproc) mysqli pdo pdo_mysql && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
apt-get install -y nodejs && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN node -v && npm -v
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY composer.json composer.lock ./
COPY package.json package-lock.json ./
RUN COMPOSER_ALLOW_SUPERUSER=1 composer install
RUN npm install
COPY . .
EXPOSE 80
У меня была эта проблема SQLSTATE[HY000] [2002] No such file or directory
, и я решил ее, добавив том в образ базы данных и изменив хост базы данных непосредственно в файле .env.
Пожалуйста, кто-нибудь может мне помочь?
Похоже на одно из:
а) Том данных MariaDB был инициализирован до того, как /docker-entrypoint-initdb.d получил запись для инициализации базы данных с отсутствующей таблицей/представлением.
или:
б) вы получаете доступ к Интернету до того, как MariaDB завершит инициализацию.
Решение для б) следующее:
services:
web:
...
depends_on:
db:
condition: service_healthy
...
db:
...
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
start_period: 10s
interval: 10s
timeout: 5s
retries: 3
...
phpmyadmin:
depends_on:
db:
condition: service_healthy
Кроме того, не передавайте MYSQL_HOST в контейнер MariaDB. Для остальных это место подключения. Для контейнера MariaDB это бессмысленно.
ссылка: https://mariadb.com/kb/en/using-healthcheck-sh/
Я решил проблему с помощью варианта b, или, лучше, я объясняю это: с помощью этого исправления я получил доступ к phpmyadmin и заметил, что база данных была создана, но пуста, поэтому мне нужно было импортировать файл sql для решения это. Кстати, спасибо :)
журналы контейнера из контейнера mariadb подтвердят поведение инициализации.