无法在Dockerfile中构buildmariaDB基础

我目前被封锁,我想build立一个数据库,当我build立一个Dockerfile。 但是我得到一个错误,我不明白为什么。 谢谢你的帮助。

在这里我的Dockerfile

FROM mariadb:latest WORKDIR /sql-files ADD sql/ /sql-files/ ENV MYSQL_ROOT_PASSWORD test123 ENV MYSQL_DATABASE testDB ENV MYSQL_USER toto ENV MYSQL_PASSWORD test123 RUN apt-get update && apt-get -y install vim && chmod +x insertDB.sh && sh insertDB.sh EXPOSE 3306 

在这里我的insertDB.sh

 #!/bin/sh /usr/bin/mysqld_safe --skip-grant-tables & sleep 5 mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD $MYSQL_DATABASE < test.sql 

和finaly我的test.sql脚本

 CREATE TABLE IF NOT EXISTS test ( id int NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY (id) ); INSERT INTO test (name) VALUES ('Toto'), ('Jack'), ('Titi'); 

所以当我执行我的docker文件与命令docker build -t maria . 我得到这个错误:

 Processing triggers for libc-bin (2.19-18+deb8u10) ... 171112 18:12:53 mysqld_safe Logging to syslog. 171112 18:12:54 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql ERROR 1049 (42000): Unknown database 'testDB' The command '/bin/sh -c apt-get update && apt-get -y install vim && chmod +x insertDB.sh && sh insertDB.sh' returned a non-zero code: 1 

我错过了什么?

使用dockerhub的mariadb图像比您尝试的更简单。

如“初始化新实例部分”中所述:

首次启动容器时,将使用提供的configurationvariables创build并初始化具有指定名称的新数据库。 此外,它将执行在/docker-entrypoint-initdb.d中find的具有扩展名.sh,.sql和.sql.gz的文件。 文件将按字母顺序执行。

所以,只需将test.sql脚本添加到/docker-entrypoint-initdb.d

那么你的Dockerfile必须以命令的forms运行mysqld。

所以,我只会在本地sql子目录中留下test.sql ,我会使用这个Dockerfile

 FROM mariadb:latest ADD sql/ /docker-entrypoint-initdb.d ENV MYSQL_ROOT_PASSWORD test123 ENV MYSQL_DATABASE testDB ENV MYSQL_USER toto ENV MYSQL_PASSWORD test123 RUN apt-get update && apt-get -y install vim EXPOSE 3306 CMD ["mysqld"] 

然后build立你的形象

 docker build -t maria . 

并运行容器(可能对映射端口有用)

 docker run --name mariadb -ti -d -p 3306:3306 maria 

它会创buildtestDB和用户toto ,正如您在Dockerfiles中使用环境variables所正确定义的那样(提醒您可以在docker run中将它们覆盖为-e参数)。

你错过了两件事:

  1. 您必须使用CREATE DATABASE testDB命令CREATE DATABASE testDB
  2. 您必须使用CREATE USER 'toto'命令CREATE USER 'toto'

您必须在运行test.sql脚本之前执行此操作。 您使用的泊坞窗图像完全是空的 – 它不知道您正在尝试使用的数据库或用户。

如果你执行了上述步骤,仍然permission denied ,那么你还应该包含一个GRANT语句,它将给出数据库testDB的必要权限。 检查MariaDB文档以获取详细信息。