Dockerfile,发出多个命令(CMD)但等待数据库提示?

Dockerfile, make multiple commands (CMD) but waiting for DB prompt?

所以我正在制作一个 docker 文件,我希望它能够设置一个项目并在之后导入一个数据库。我正在使用 XAMPP 和附带的 MariaDB。我知道我需要使用 CMD 进行导入,因为 XAMPP 必须是 运行ning。我正在尝试通过 运行 宁一个 sql 脚本来导入数据库,该脚本在数据库提示符中完成工作。

我尝试使用 && 和 ;用于在一行中链接命令,但它不会工作,因为它会在等待 MariaDB 提示符之前尝试 运行 终端提示符上的所有命令。有什么想法吗?

这是我的 docker 文件,最后一行是我尝试导入数据库:

FROM cswl/xampp

COPY . /opt/lampp/htdocs/

WORKDIR /opt/lampp/htdocs/

RUN curl -sS https://getcomposer.org/installer | /opt/lampp/bin/php &&\
  /opt/lampp/bin/php composer.phar install

RUN curl https://s3.amazonaws.com/careers-picpay/lista_relevancia_1.txt --output db/lista_relevancia_1.txt &&\
  curl http://s3.amazonaws.com/careers-picpay/lista_relevancia_2.txt --output db/lista_relevancia_2.txt &&\
  curl https://s3.amazonaws.com/careers-picpay/users.csv.gz --output db/users.csv.gz

RUN gzip -d db/users.csv.gz

CMD /opt/lampp/bin/mysql -u root && source ./initdb.sql

更新: 因此,我还尝试将我的两个命令替换为一个带有 MariaDB -e 选项的命令,以便在登录后执行一行...没有用,没有创建数据库,我不知道为什么。这是命令:

CMD /opt/lampp/bin/mysql -u root -e "source ./initdb.sql"

您可以使用 wait-for-it.sh 通过将其添加到 CMD:

来检查数据库是否已启动
CMD ["path/to/wait-for-it.sh", "localhost:3306", "-t", "6000", "--", "YOUR ACTUAL COMMAND"]

您可以先将脚本复制到您的容器中。

这里是more info

已编辑

对于 MariaDB 官方镜像,只需复制目录 /docker-entrypoint-initdb.d 中的初始化脚本 (initdb.sql)。 参见 MariaDB Docker Quick Reference。该目录中的文件在创建和初始化容器时按字母顺序执行。

有了XAMPP的图片,看来得手动操作了。这绝对不是一个优雅的解决方案,但它应该有效。

将图像的 ENTRYPOINT 脚本替换为这个:

#!/bin/bash

/opt/lampp/lampp start

# wait for mysql to be ready
while ! /opt/lampp/bin//mysql --protocol TCP  -e "show databases;"; do sleep 2; done

# initialize the database
/opt/lampp/bin/mysql -u root -e "source /init.sql"

## Run tail so we don't exit
/usr/bin/tail -f /opt/lampp/logs/php_error_log

这将等待 mysql 准备就绪,然后再执行 source 命令。

将以下内容添加到 Dockerfile 以复制初始化 sql 脚本并覆盖 ENTRYPOINT:

FROM cswl/xampp
...

COPY init.sql /init.sql

COPY init.sh /init.sh
RUN chmod +x /init.sh

ENTRYPOINT  ["/init.sh"]