Как в Dockerfile (с базовым образом MySQL), как я могу выполнить команды liquibase, чтобы создать вашу схему или заполнить базу данных? - PullRequest
0 голосов
/ 17 мая 2019

У меня проблемы с использованием liquibase во время сборки, чтобы создать мою схему и заполнить базу данных изображением, расширяющим базовый образ mysql 5.7. В частности, я получаю тайм-аут, потому что я не могу подключиться к своей базе данных в том же единственном образе.

Последняя строка в Dockerfile ниже не будет выполнена. Я получаю ошибку:

Starting Liquibase at Thu, 16 May 2019 22:09:50 UTC (version 3.6.3 built at 2019-01-29 11:34:48)
Unexpected error running Liquibase: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

...

Caused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
        at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
        at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
        at java.base/java.net.Socket.connect(Socket.java:591)
        at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
        at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
        ... 12 common frames omitted
FROM mysql:5.7

ENV MYSQL_DATABASE dbname

# Install wget, jdk, liquibase, mysql connector/j
...

RUN liquibase --changeLogFile=/path/to/script/schema.mysql.sql \
        --username=root \
        --password=password \
        --url=jdbc:mysql://localhost:3306/dbname" \
        --driver=com.mysql.cj.jdbc.Driver \
        --classpath=/path/to/liquibase/liquibase.jar:/path/to/mysql-connector/mysql-connector-java-8.0.16.jar \
        --contexts="Initialization" \
        update

Я ожидаю, что сценарий sql будет выполнен для создания схемы базы данных.

1 Ответ

0 голосов
/ 17 мая 2019

Я понял, что MySQL еще не запущен во время сборки. Я добавил эту строку в качестве последней строки файла Docker и закомментировал бит, который не работал.

Step 14/14 : RUN /etc/init.d/mysql status
 ---> Running in 7701598d1eff
MySQL Community Server 5.7.25 is not running.

Docker не будет выполнять точку входа базового образа (которая фактически инициализирует базу данных) до самого конца сборки (если я не определю свою собственную точку входа). Источник: Что происходит с точкой входа родительского образа Docker, когда потомок определяет другое?

Таким образом, одним из вариантов будет определение моей собственной точки входа и копирование материала из базового изображения. Вероятно, не лучшая практика ...

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

...