我正在使用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失败,它没有完成构建,我收到此错误:
ERROR 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"
奇怪的是,执行此操作通常也会使容器崩溃,并将其置于每次尝试重新启动时都会在启动时再次崩溃的状态。
答案 0 :(得分:3)
我认为问题可能是服务还没有在用于构建Dockerfile的容器中启动。
答案 1 :(得分:2)
在Dockerfile中使用以下命令:
RUN service mysql restart && echo 'CREATE DATABASE db_name;' | mysql -uroot -
pYOUR_ROOT_PASSWORD
答案 2 :(得分:1)
有同样的问题:启动容器并运行一组RUN
指令,或.sh
中的.sql
或/docker-entrypoint-initdb.d/
脚本没有连接到数据库服务器可以建立。
我在mysql-image上找到了comment of @wpalmer的解决方案:
入口点运行的init脚本在内部使用变量" $ {mysql [@]}"调用mysql(例如,当加载放置在docker-entrypoint-initdb.d目录中的.sql文件时。由入口点处理的任何.sh文件都包含在" sourcing"它们中,这意味着变量可供任何运行的.sh文件使用。
那么这对你意味着什么,而不是像用户那样提供普通的mysql
命令,传递等等。
RUN mysql -u root -ppassword -e "CREATE DATABASE dbname"
改为使用占位符:
RUN "${mysql[@]}" -e "CREATE DATABASE dbname"
答案 3 :(得分:0)
您可以尝试构建其他图像并从那里运行create DB。 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 "$@"