Назад | Перейти на главную страницу

Docker Compose - не удается запустить мое веб-приложение и изображения mysql

Я новичок в докере, и мне сложно заставить работать следующий сценарий: у меня есть рабочий образ веб-приложения, который использует alpine с tomcat 9 в качестве базового образа и добавил мое веб-приложение вместе с серией пользовательских библиотек.

Затем у меня есть образ базы данных с базой mysql, который я импортировал в базу данных, необходимую моему веб-приложению для работы.

Если я запускаю эти изображения отдельно, они работают нормально, у меня есть 100% доступ к ним из хост-системы, никаких проблем.

Теперь мне нужно, чтобы они общались между собой, мне показалось, что это будет легкая часть, но я не могу заставить это работать.

Это мой composer.yml:

version: "3"
networks:
  uno:
services:
  mysql:
    image: mysql
    ports:
      - "3307:3306"
    networks:
      - uno
  web:
    image: unoerp9
    ports:
      - "8888:8080"
    depends_on:
      - mysql
    links:
      - mysql
    networks:
      - uno

Контейнер запускается нормально: Проверьте изображение здесь

Но через несколько секунд в журнале появляются ошибки, и контейнер mysql останавливается:

mysql_1 | /usr/local/bin/docker-entrypoint.sh: выполняется /docker-entrypoint-initdb.d/bck.sql

mysql_1 | mysql: [Предупреждение] Использование пароля в интерфейсе командной строки может быть небезопасным.

mysql_1 | mbind: операция запрещена

mysql_1 | mbind: операция запрещена

mysql_1 | ОШИБКА 1822 (HY000) в строке 17806: не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения "fn_comissao_pagto_grupo_ibfk_1" в указанной таблице "vd_grupo_colaborador"

db_mysql_1 вышел с кодом 1

Поскольку в контейнере mysql есть ошибки, ошибки триггера контейнера webapp связаны с невозможностью подключиться к базе данных, что вполне ожидаемо, поэтому я их опускаю.

Кроме того, поскольку изображения работают нормально по отдельности, я не думаю, что это какая-то ошибка, связанная с тем, как я их построил, это должно быть то, чего мне не хватает в моем файле композитора. Ожидаемый результат - оба изображения работают и обмениваются данными, в то время как я могу получить доступ к веб-изображению через браузер (localhost: 8888 /) и базу данных (localhost: 3307).

Любая помощь?

Вам нужно добавить зависимость веб-изображения от образа mysql, добавив эти строки

depends_on: - mysql

Вы можете связать веб-изображение с изображением базы данных, используя:

links: - mysql

Итак, вы можете использовать mysql в качестве имени хоста для подключения к базе данных.

Попробуйте использовать конкретный образ mysql, например mysql:5.7.22

Эта ошибка mysql_1 | ERROR 1822 (HY000) at line 17806: Failed to add the foreign key constraint. Missing index for constraint 'fn_comissao_pagto_grupo_ibfk_1' in the referenced table 'vd_grupo_colaborador' связан с вашей схемой mysql, и мы не можем помочь с этим, не показав нам исходный код, если вы можете поделиться им, это было бы здорово.

Вы можете значительно упростить свой составной файл:

version: "3"
services:
  mysql:
    image: mysql:5.7
    volumes:
       - mysql-data:/var/lib/mysql
  web:
    image: unoerp9
    ports:
      - "8888:8080"

Для каждого файла набора автоматически создается сеть, и все контейнеры являются ее частью. В этой сети открыты все порты контейнеров. Это означает, что вы можете подключиться из своего tomcat к базе данных с помощью mysql/my_database_name, вы также можете пропустить порт, потому что это 3306 по умолчанию.

Я считаю, что ваша ошибка MySQL возникает из-за того, что образ по умолчанию mysql: latest - это версия 8, которая, вероятно, не совпадает с производственной системой. Выше я выбрал тег 5.7, потому что он в некоторой степени определяет версию, поэтому у вас не будет проблем с совместимостью, но вы все равно сможете воспользоваться обновлениями безопасности, например, от 5.7.22 (который предложил @Mohsen) до 5.7.23, который является новейшей версией на момент.

Я также добавил том для хранения данных базы данных (в случае, если это полезно), поэтому изменения, которые вы вносите в базу данных, сохраняются между перезапусками (docker-compose down) при удалении контейнеров.