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

时间:2016-02-18 10:56:23

标签: mysql linux docker virtual-machine dockerfile

我正在使用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"

奇怪的是,执行此操作通常也会使容器崩溃,并将其置于每次尝试重新启动时都会在启动时再次崩溃的状态。

4 个答案:

答案 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 "$@"