在Dockerfile(带有MySQL基本映像)中,如何运行liquibase命令来创建架构或为数据库创建种子?

时间:2019-05-16 22:14:35

标签: mysql docker liquibase

在构建时使用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 :(得分:0)

我发现在构建时mysql尚未真正运行。我将此行添加为dockerfile的最后一行,并注释掉了不起作用的位。

  set linetype 1 lc "green"
  set linetype 2 lc "red"
  set linetype 3 lc "blue"
  unset key
  set yrange [0:1]
  set style data histogram
  set style histogram cluster gap 3
  set style fill solid

  plot for [col=2:4] 'inputfile' using col:xticlabel(1)

在构建结束之前,Docker不会执行基础映像的入口点(实际上是初始化数据库)(除非我定义自己的入口点)。来源:What happens to entrypoint of Docker parent image when child defines another one?

因此,一种选择是定义我自己的入口点,并从基本映像中复制内容。可能不是最佳做法...

或者,我可以使用一个中间容器为该数据库提供docker compose之后的种子。