Bash 如何对mariaDB docker容器运行sql脚本
我试图在docker中创建一个mariadb实例,然后针对它运行目录中的所有文件。我知道我的脚本在dockerfile运行后执行时可以工作,但当我将脚本放入docker文件时,它报告mariadb出现错误。我已尝试将对mysqld的调用放在脚本中,但这并没有解决问题。Bash 如何对mariaDB docker容器运行sql脚本,bash,docker,docker-compose,mariadb,Bash,Docker,Docker Compose,Mariadb,我试图在docker中创建一个mariadb实例,然后针对它运行目录中的所有文件。我知道我的脚本在dockerfile运行后执行时可以工作,但当我将脚本放入docker文件时,它报告mariadb出现错误。我已尝试将对mysqld的调用放在脚本中,但这并没有解决问题。 Dockerfile ENV MYSQL_ROOT_PASSWORD test ENV MYSQL_DATABASE mydatabase COPY . /usr/src WORKDIR /usr/src RUN script
Dockerfile
ENV MYSQL_ROOT_PASSWORD test
ENV MYSQL_DATABASE mydatabase
COPY . /usr/src
WORKDIR /usr/src
RUN script_runner.sh test
EXPOSE 3306
CMD ["mysqld"]
脚本\u runner.shfiles=`ls start_script | grep ^'do'`
for script in $files
do
mysql -u root --password=$1 < `pwd`/start_script/$script
done
文件系统
-repo/
--docker-compose.yml
--mariadb/
---Dockerfile
---script_runner.sh
----start_script/
----do-release.sql
错误
您的
脚本\u runner.sh
文件需要可执行权限,否则将找不到可执行文件。尝试在本地文件夹(chmod 7xx)或Dockerfile内设置该属性
COPY . /usr/src
WORKDIR /usr/src
RUN chmod 711 script_runner.sh
RUN script_runner.sh test
我同意上面的评论,即您需要使script_runner.sh脚本可执行,这可能是返回代码的原因。然而,我想你会发现,即使在使其可执行之后,它仍然无法工作 在执行
runscript\u runner.sh测试时,MySQL服务器在构建过程中还没有在Docker容器中实际运行。因此,如果您使脚本可执行,我想您会看到它将返回“cannotconnecttomysql sock”类型的错误。作为Docker构建的一部分,您必须启动mysqld。另外,请记住,docker构建将单独执行每个RUN语句,并在该命令完成后对磁盘进行一层更改。如果您只是尝试发出一个运行mysqld
(或类似命令),mysqld进程将永远启动并阻塞(假设它不进行后台监控),或者(如果您告诉它进行后台监控)它将启动并移动到后台,docker将创建一层磁盘,然后执行您的脚本\u runner.sh
,但mysql将退出
如果要执行此操作,有两个选项:
将这两个语句组合成一个运行语句,例如runmysqld\u safe&&script\u runner.sh
让脚本_runner.sh在尝试执行mysql客户端之前启动mysqld
无论哪种方法都应该有效,并且(我认为)最终都会发生相同的单层磁盘更改。这些文档在其最佳实践建议中提到了这一点(尽管出于性能原因,他们在这里试图尽量减少层数):
你正在重新发明轮子。转到,查找“初始化新实例”。Extract:…此外,它将执行扩展名为.sh、.sql和.sql.gz的文件,这些文件位于/docker entrypoint initdb.d
阅读其余文件以了解更多信息。只要简单地复制或挂载你的文件在那里,你就完成了。我需要运行这个每次旋转起来。这些脚本不输入数据,只需确保表结构与上面的示例和输出一致,脚本在构建时只运行一次。此外,您的脚本希望连接到mysql。。。这不是在您构建时启动的。只有当容器启动映像并启动entrypoint脚本和命令时,它才会启动并运行。
Building mariadb
Step 1/8 : FROM mariadb:10.4.11-bionic
---> bc20d5f8d0fe
Step 2/8 : ENV MYSQL_ROOT_PASSWORD test
---> Running in 5987d662632b
Removing intermediate container 5987d662632b
---> e40256430e39
Step 3/8 : ENV MYSQL_DATABASE mydatabase
---> Running in a865ef21cdcc
Removing intermediate container a865ef21cdcc
---> dc5997996fef
Step 4/8 : COPY . /usr/src
---> 5314d67545bb
Step 5/8 : WORKDIR /usr/src
---> Running in 4643fe58e44e
Removing intermediate container 4643fe58e44e
---> 88e7901d501a
Step 6/8 : RUN script_runner.sh test
---> Running in 502ab4fddbb8
/bin/sh: 1: script_runner.sh: not found
ERROR: Service 'mariadb' failed to build: The command '/bin/sh -c script_runner.sh test' returned a non-zero code: 127
COPY . /usr/src
WORKDIR /usr/src
RUN chmod 711 script_runner.sh
RUN script_runner.sh test