在我的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'
答案 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_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