如何在Docker映像中运行mysql脚本?

时间:2020-07-20 15:54:00

标签: mysql docker

在我的Dockerfile中

FROM mysql:5.7

ADD ./mysql_scripts /mysql_scripts 
WORKDIR /mysql_scripts
RUN mysql -u root -p < create_user.sql &&\
    mysql -u root -p < create_database.sql &&\
    mysql -u root -p < create_tables.sql

EXPOSE 3306

但是当我生成该图像时,我遇到了类似问题:Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

2 个答案:

答案 0 :(得分:2)

您无法在构建时导入数据库,因为每个RUN命令在单独的外壳程序中运行,加上MySQL进程也未准备好接受连接。

您可以从 docker入口点中获益,这些入口点是开箱即用的。

COPY create_user.sql  /docker-entrypoint-initdb.d/
COPY create_database.sql /docker-entrypoint-initdb.d/
COPY create_tables.sql /docker-entrypoint-initdb.d/

因此,当容器启动时,它将以字母顺序

运行上述脚本

首次启动容器时,将创建一个具有指定名称的新数据库,并使用提供的配置变量对其进行初始化。此外,它将执行在.sh, .sql and .sql.gz中具有扩展名/docker-entrypoint-initdb.d 的文件。文件将按字母顺序执行。您可以通过将SQL转储安装到该目录中并为自定义图像提供贡献的数据来轻松填充mysql服务。默认情况下,SQL文件将导入到MYSQL_DATABASE变量指定的数据库中。

mysql-docker-init-db

您还可以使用MYSQL_USER创建用户。

答案 1 :(得分:2)

您不能运行这些mysql命令,因为该容器尚未运行,因此MySQL也未运行。

您可以做的是将.sql文件复制到/docker-entrypoint-initdb.d。初始化后,MySQL将运行此目录中的所有.sql.sql.gz.sh,这将导致以下Dockerfile:

FROM mysql:5.7

COPY ./mysql_scripts /docker-entrypoint-initdb.d

EXPOSE 3306

More information can be found on the dockerhub page of mysql