当前位置: 首页 > 知识库问答 >
问题:

如何在docker容器中运行查询后Mariadb已经启动?

高玮
2023-03-14

我试图创建一个maryadb容器,并希望有一个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\u 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-不工作

我还尝试使用ENTRYPOINTCMD使用mysql执行creation.sql,但是它们在运行过程中似乎失败了。一个CMD解决方案的例子,它应该调用mysqld(匹配Mariadb Dockerfile中的内容),然后运行sql,但在运行容器时失败:

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脚本文件?

共有2个答案

翟俊名
2023-03-14

查看Docker Hub上的MariaDB文档,似乎有一个用于执行辅助脚本的内置流程

第一次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量初始化该数据库。此外,它将执行扩展名为.sh、.sql、.sql.gz和.sql.xz的文件,这些文件位于/docker entrypoint initdb.d中。文件将按字母顺序执行。没有文件执行权限的sh文件是源文件而不是执行文件。您可以通过将SQL转储装载到该目录中并提供带有已贡献数据的自定义映像,轻松地填充mariadb服务。默认情况下,SQL文件将导入到由MARIADB\u database/MYSQL\u database变量指定的数据库中。

https://hub.docker.com/_/mariadb

邹英光
2023-03-14

您可以将该命令添加为CMD行:

FROM mariadb:10.5.6

# Copy a "creation.sql" script to the container
COPY /sql/* /sql/

CMD mysql -e "source sql/creation.sql;" -uroot -pMyPasswordHere

您也可以从docker-compose.yml文件调用CMD:

version: '3'
services:
  service:
    ...
    command: 'command-to-start'

您可能需要在其中添加一行,使其Hibernate一段时间,以确保在脚本运行之前进程开始正常。您可以将其放在脚本中,但如果需要,可以将其作为脚本后的第一个命令包含在CMD行中:CMD第一命令睡眠

如果您发现CMD选项正在阻止MariaDB启动,您可能需要添加自己的请求以启动该进程。看看他们的Dockerfile(https://github.com/MariaDB/mariadb-docker/blob/master/10.5/Dockerfile)就会发现:

CMD ["mysqld"]

因此,您将具有CMD第一命令

不过,这将作为shell进程执行,而不是exec,因为exec有一些缺点:https://til.codes/docker-run-vs-cmd-vs-entrypoint/

其他选项包括将所有这些放入shell脚本,并在启动时调用它:CMD[“start.sh”]。在这里,您将确保最后一个命令mysqld作为exec mysqld执行,然后确保它是执行的主进程,就像运行CMD[“mysqld”]一样。

如果您想制作自己的服务容器,也可以使用类似SupervisorD的服务:http://supervisord.org

或者为每个进程提供自己的容器。不使用标准的MariaDB容器,然后使用脚本运行容器以调用命令或执行自定义进程。当然,这一切都取决于您正在尝试做什么,以及您需要与容器内容进行多少交互。如果调用docker容器命令,您可以将docker套接字装载到容器中,安装docker,然后能够从其中执行docker exec-it my_container\u name mysql-e“source sql/creation.sql;”-uroot-pMyPasswordHere命令:访问容器中的docker套接字。如果您认为有必要构建一个主管容器来跨应用程序执行大量自定义流程,那么这可能是一个不错的选择。

一如既往,有很多方法可以做到这一点。首先,我会尝试:

CMD mysql -e "source sql/creation.sql;" -uroot -pMyPasswordHere

如果Mariadb没有启动,因为它已经覆盖了默认的CMD进程,那么可能会探索start.sh的解决方案。

我不熟悉MariaDB,但我还将探讨您尝试运行的命令是否可以作为配置文件传递或附加到start命令:mysqld--variable--etc.:https://hub.docker.com/_/mariadb/

 类似资料:
  • 问题内容: 我准备了一个docker-compose文件来部署带有数据库的容器: 没关系。但是现在我需要创建一个数据库并建立其结构。我需要执行一些sql命令。为了检查我是否能够做到这一点,我将其添加到服务中: 但是我遇到以下错误: 我感觉命令是在Sql Server实例启动之前执行的。我该如何解决?Sql Server启动后如何执行一些sql? 问题答案: 问题是在容器中仅执行一个命令。当您在其中

  • 我见过一堆教程,它们似乎做了与我想做的相同的事情,但由于某种原因,我的Docker容器退出了。基本上,我在Docker容器中设置了一个Web服务器和几个守护进程。我通过一个名为的bash脚本来完成这一过程的最后部分,该脚本通过DockerFile中的CMD运行。如下所示: 我在Dockerfile中启动它,如下所示: 我可以看到,当我手动运行事情时(即使用-i-t/bin/bash进入映像),所有

  • 问题内容: 我正在使用Search Guard插件来保护由多个节点组成的elasticsearch集群。这是我的Dockerfile: 初始化SearchGuard(创建内部用户并分配角色)。容器启动后,我需要运行脚本。这是问题所在:除非运行Elasticsearch,否则脚本将不会初始化任何安全性索引。 脚本的内容是: 现在,我只是在容器启动后手动运行脚本,但是由于我是在Kubernetes上运

  • 问题内容: 我看过很多教程似乎都在做我想做的事情,但是由于某种原因,我的Docker容器退出了。基本上,我正在Docker容器内设置一个Web服务器和一些守护程序。我通过bash脚本(在Dockerfile中通过CMD运行)完成了最后部分。看起来像这样: 然后在Dockerfile中启动它,如下所示: 我可以看到,当我手动运行事物时(即使用-i -t / bin / bash进入映像),所有服务都

  • 我有一个服务,我正在通过Rancher通过Docker-Compose提出。我遇到的问题是需要在容器部署后设置密码。

  • 问题内容: 我创建了一个容器,因此它不是交互式的。 我看到容器已退出: 现在,我想在计算机上偶尔运行命令并退出。只是为了得到回应。 我试图启动机器。我尝试附加。我以为我可以用一个容器打电话,但这似乎是不允许的。使用似乎可以运行,然后迅速存在。 我想退出后回到互动模式。 我试过了: 但是我得到: 但是,如果我启动它,它仍然会退出。赶上22.我赢不了。 问题答案: 在2014年10月,Docker团队