Docker - Docker 文件中的 MySQL 命令使用 运行(错误 2002)
Docker - MySQL commands within Dockerfile using RUN (ERROR 2002)
我正在使用 Docker 创建一个 docker 文件,其中 mysql 作为基本图像:
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
docker文件在我尝试创建数据库的步骤中失败,它没有完成构建并且我收到此错误:
错误 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock'
连接到本地 MySQL 服务器
当我删除#create database 运行 命令时,docker 文件将生成,我能够从该映像运行 一个容器。我知道这不是 mysql 服务器的问题,因为我可以手动进入容器并 运行 mysql 命令成功,服务状态为 运行ning .
在文件中使用环境变量,即 MYSQL_ROOT_PASSWORD 也允许我成功创建数据库,但这只适用于单个数据库,我需要能够使用 mysql 命令进行查询,例如创建额外的数据库/分配用户等
这可能是因为我需要指定 docker 容器的主机和端口,但这仍然不允许我连接
RUN mysql -u root -ppassword -h 127.0.0.1 -P 3308 -e "CREATE DATABASE dbname"
奇怪的是,这样做也经常使容器崩溃,并使它处于一种状态,每次我尝试重新启动它时,它都会在启动时再次崩溃。
我认为问题可能在于用于构建 Dockerfile 的容器中的服务尚未启动。
- 尝试一步启动和配置 MySQL 服务器。作为参考,请查看此文件:https://github.com/dockerfile/mysql/blob/master/Dockerfile
您可以尝试构建其他映像并运行 从那里创建数据库。
docker-compose.yml
的例子
web:
build: web
links:
- "db:db.local"
entrypoint: entrypoint.sh
db:
build: db
environment:
MYSQL_ROOT_PASSWORD: password
command: mysqld
对于entrypoint.sh,你输入如下内容:
#!/bin/sh
#this is a hack to wait until the DB image is up and the port is open
until mysqladmin -u root -ppassword -e -h db.local ping; do
echo "$(date) - waiting for mysql"
sleep 3
done
if ! mysql -u root -ppassword -e -h db -e 'use dbname'; then
mysql -u root -ppassword -e "CREATE DATABASE dbname"
fi
exec "$@"
遇到了同样的问题:当启动容器和 运行 一组 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
命令、传递等
RUN mysql -u root -ppassword -e "CREATE DATABASE dbname"
改用占位符:
RUN "${mysql[@]}" -e "CREATE DATABASE dbname"
在您的 Dockerfile 中使用下面给出的命令:
RUN service mysql restart && echo 'CREATE DATABASE db_name;' | mysql -uroot -
pYOUR_ROOT_PASSWORD
我正在使用 Docker 创建一个 docker 文件,其中 mysql 作为基本图像:
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
docker文件在我尝试创建数据库的步骤中失败,它没有完成构建并且我收到此错误:
错误 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock'
连接到本地 MySQL 服务器当我删除#create database 运行 命令时,docker 文件将生成,我能够从该映像运行 一个容器。我知道这不是 mysql 服务器的问题,因为我可以手动进入容器并 运行 mysql 命令成功,服务状态为 运行ning .
在文件中使用环境变量,即 MYSQL_ROOT_PASSWORD 也允许我成功创建数据库,但这只适用于单个数据库,我需要能够使用 mysql 命令进行查询,例如创建额外的数据库/分配用户等
这可能是因为我需要指定 docker 容器的主机和端口,但这仍然不允许我连接
RUN mysql -u root -ppassword -h 127.0.0.1 -P 3308 -e "CREATE DATABASE dbname"
奇怪的是,这样做也经常使容器崩溃,并使它处于一种状态,每次我尝试重新启动它时,它都会在启动时再次崩溃。
我认为问题可能在于用于构建 Dockerfile 的容器中的服务尚未启动。
- 尝试一步启动和配置 MySQL 服务器。作为参考,请查看此文件:https://github.com/dockerfile/mysql/blob/master/Dockerfile
您可以尝试构建其他映像并运行 从那里创建数据库。 docker-compose.yml
的例子web:
build: web
links:
- "db:db.local"
entrypoint: entrypoint.sh
db:
build: db
environment:
MYSQL_ROOT_PASSWORD: password
command: mysqld
对于entrypoint.sh,你输入如下内容:
#!/bin/sh
#this is a hack to wait until the DB image is up and the port is open
until mysqladmin -u root -ppassword -e -h db.local ping; do
echo "$(date) - waiting for mysql"
sleep 3
done
if ! mysql -u root -ppassword -e -h db -e 'use dbname'; then
mysql -u root -ppassword -e "CREATE DATABASE dbname"
fi
exec "$@"
遇到了同样的问题:当启动容器和 运行 一组 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
命令、传递等
RUN mysql -u root -ppassword -e "CREATE DATABASE dbname"
改用占位符:
RUN "${mysql[@]}" -e "CREATE DATABASE dbname"
在您的 Dockerfile 中使用下面给出的命令:
RUN service mysql restart && echo 'CREATE DATABASE db_name;' | mysql -uroot -
pYOUR_ROOT_PASSWORD