【发布时间】:2021-05-24 17:15:41
【问题描述】:
我正在尝试创建一个 mariadb 容器,并希望在开头启动一个 SQL 脚本。
基础 Dockerfile
FROM mariadb:10.5.6
# Copy a "creation.sql" script to the container
COPY /sql/* /sql/
手动执行作品
如果我在容器启动后等待 10-20 秒,然后执行命令行 docker exec -it my_container_name mysql -e "source sql/creation.sql;" -uroot -pMyPasswordHere 然后脚本运行正常。但我宁愿这部分的构建或运行过程,而不是需要手动步骤和猜测等待时间。
运行 - 不起作用
我尝试在 Dockerfile 中使用 RUN:
RUN mysql -e "source sql/creation.sql;" -uroot -p$MYSQL_ROOT_PASSWORD`
但它 失败:在构建期间无法通过套接字连接到本地 MySQL 服务器。我认为这是因为服务尚未启动。
CMD - 不起作用
我还尝试使用ENTRYPOINT 和CMD 使用mysql 执行creation.sql,但它们在运行期间似乎失败了。应调用mysqld(匹配mariadb Dockerfile 中的内容)然后运行sql,但在运行容器时失败的CMD 解决方案示例:
FROM mariadb:10.5.6
COPY /sql/* /sql/
CMD mysqld && mysql -e "source sql/creation.sql;" -uroot -p$MYSQL_ROOT_PASSWORD
带有 shell 脚本的 CMD - 不起作用
同样失败的基于脚本的解决方案示例:
FROM mariadb:10.5.6
COPY /sql/* /sql/
COPY /scripts/* /scripts/
CMD ["./scripts/start.sh"]
start.sh:
exec mysqld
echo "Running start script\n" > start.log
for i in {1..20}
do
sleep 3
echo "Attempt $i"
echo "Attempt $i" &>> start.log
mysql -e "source sql/creation.sql;" -uroot -p$MYSQL_ROOT_PASSWORD &>> start.log
done
echo "Done" &>> start.log
有简单的解决方案吗?
有没有什么方法可以只用 Dockerfile 或者一个小的 shell 脚本来运行 SQL 脚本文件?
【问题讨论】:
-
我只使用 Dockerfile,而不是 docker-compose,因为数据库不是多容器应用程序。但如果这是唯一可能的解决方案,我可能不得不考虑它。
-
也许可以改编stackoverflow.com/questions/25503412/…中的shell脚本sn-ps之一?