В Docker: неустранимая ошибка: Uncaught PDOException: SQLSTATE[42S02]: базовая таблица или представление не найдены: 1146 Таблица «cinema.movies» не существует в

Я попытался создать контейнер для приложения 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 подтвердят поведение инициализации.

danblack 11.07.2024 04:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже на одно из:

а) Том данных 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 для решения это. Кстати, спасибо :)

Flavio 14.07.2024 16:32

Другие вопросы по теме