Я новичок в докере, и мне сложно заставить работать следующий сценарий: у меня есть рабочий образ веб-приложения, который использует 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
) при удалении контейнеров.