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"]
所以我正在制作一个 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"]