【发布时间】:2019-12-28 17:20:32
【问题描述】:
我想做什么:
- 创建一个运行 mariadb 服务器的容器
- 在容器构建之前运行一些自定义查询。 (一开始没有)
我做了什么:
- 我创建了一个
docker-compose.yml文件,在其中描述了我的服务,对于每个组件,我创建了一个 dockerfile 插入要运行的命令。我得到了显示的错误。 - 我添加了一些睡眠秒数。没有任何改变
- 我尝试根据数据库创建第二个服务并从那里运行查询。没有任何改变,仍然是同样的错误。
问题出在哪里?
在构建并运行每个服务之前,我无法执行任何命令。 在以下 dockerfile 中:
FROM mariadb:latest
ARG MYSQL_ROOT_PASSWORD
RUN mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "CREATE DATABASE test"
我收到以下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
这是docker-compose.yml 文件:
version: '3.1'
services:
db:
image: mariadb:latest
build:
context: ./db
args:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
container_name: IUB_sql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_DATABASE: "useless_test_db"
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
ports:
- ${MYSQL_PORT}:3306
注意:
我不想只创建一个数据库,我想运行一些任意查询。
注2:
如果我删除RUN mysql ... 行,服务就会启动。然后,如果我尝试运行以下命令,我就能成功运行查询:
docker exec -umysql -it IUB_sql mysql -uroot -p -e "CREATE DATABASE test_cmdline"
【问题讨论】:
-
You can't create a
mysqlderived image with prepopulated data;标准模式是将您的 SQL 脚本放在/docker-entrypoint-initdb.d中,并让它们在第一次启动时运行。您是否有特定原因试图避免这种模式? -
@DavidMaze 谢谢,我不知道这种模式。我现在尝试使用它,但它似乎不适用于 mariadb,因为此图像没有文件:
/entrypoint.sh。你有什么建议吗? -
我不确定该特定文件是什么,或者您为什么需要引用它。 the
mariadbDocker Hub image page 中有一段关于模式的简短段落(在“初始化新实例”下)。
标签: mysql docker mariadb dockerfile