Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何对mariaDB docker容器运行sql脚本_Bash_Docker_Docker Compose_Mariadb - Fatal编程技术网

Bash 如何对mariaDB docker容器运行sql脚本

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

我试图在docker中创建一个mariadb实例,然后针对它运行目录中的所有文件。我知道我的脚本在dockerfile运行后执行时可以工作,但当我将脚本放入docker文件时,它报告mariadb出现错误。我已尝试将对mysqld的调用放在脚本中,但这并没有解决问题。
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.sh

files=`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