在 Dockerfile(带有 MySQL 基础映像)中,我如何 运行 liquibase 命令来创建您的模式或为您的数据库播种?
In a Dockerfile (with MySQL base image), how can I run liquibase commands to create your schema or seed your database?
我在构建时使用 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 脚本来创建我的数据库模式。
我发现 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 compose 之后使用中间容器为数据库播种。
我在构建时使用 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 脚本来创建我的数据库模式。
我发现 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 compose 之后使用中间容器为数据库播种。