数据库
首页 > 数据库> > Docker-使用RUN(ERROR 2002)在Dockerfile中使用MySQL命令

Docker-使用RUN(ERROR 2002)在Dockerfile中使用MySQL命令

作者:互联网

我正在使用Docker创建一个以mysql为基础映像的dockerfile:

FROM mysql
#set root pass
ENV MYSQL_ROOT_PASSWORD password
#update linux
RUN apt-get update
#create database
RUN mysql -u root -ppassword -e "CREATE DATABASE dbname"
#install vim
RUN apt-get install vim -y

在我尝试创建数据库的步骤上,dockerfile失败,它没有完成构建,并且我收到此错误:

错误2002(HY000):无法通过套接字’/var/run/mysqld/mysqld.sock’连接到本地MySQL服务器

当我删除#create database run命令时,将构建dockerfile,并且能够从该映像运行容器.我知道这不是mysql服务器的问题,因为我可以输入容器并成功手动运行mysql命令,并且服务状态正在运行.

在文件中使用环境变量(即MYSQL_ROOT_PASSWORD)还可以使我成功创建数据库,但这仅适用于单个数据库,我需要能够使用mysql命令进行查询,例如创建其他数据库/分配用户等. .

这可能是因为我需要指定docker容器的主机和端口,但这仍然不允许我连接

RUN mysql -u root -ppassword -h 127.0.0.1 -P 3308 -e "CREATE DATABASE dbname"

奇怪的是,这样做通常还会使容器崩溃,并使其处于每次启动时都会再次崩溃的状态.

解决方法:

遇到了同样的问题:启动容器并运行一组RUN指令,或者/docker-entrypoint-initdb.d/中的.sh或.sql脚本时,无法建立与数据库服务器的连接.

我在mysql-image上找到了一个comment of @wpalmer的解决方案:

The init scripts run by the entrypoint, internally, use the variable “${mysql[@]}” to call mysql (for example, when loading .sql files placed in the docker-entrypoint-initdb.d directory. Any .sh files which are processed by the entrypoint are included by “sourcing” them, meaning that variable is available for use by any .sh files which are run).

因此,这对您而言意味着什么,而不是像下面那样向用户提供普通的mysql命令,pass等.

RUN mysql -u root -ppassword -e "CREATE DATABASE dbname"

改用占位符:

RUN "${mysql[@]}" -e "CREATE DATABASE dbname"

标签:docker,dockerfile,virtual-machine,linux,mysql
来源: https://codeday.me/bug/20191027/1943649.html