我正在使用docker-compose
在容器中设置Mariadb
数据库并运行迁移以使其准备就绪。问题是这样做时出现以下错误:
Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
这使我认为Dockerfile
中的数据库目前尚未建立,但我可能是错的。有什么想法吗?
Dockerfile
内容:
FROM mariadb:10.0.37
ADD db /db
WORKDIR /db
RUN mysql --user userExample --password passwordExample < migrate.sql
docker-compose.yaml
内容:
version: '3'
services:
db:
build: .
environment:
- MYSQL_USER=userExample
- MYSQL_PASSWORD=passwordExample
networks:
example_network:
ipv4_address: 172.28.1.1
networks:
example_network:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
答案 0 :(得分:1)
如果需要从主机连接到Db,最简单的操作就是以network=host
模式启动此容器。因此,容器不会获得它自己的网络,而是会使用主机的网络。
首先更新您的docker-compose.yml
:
version: '3'
services:
db:
build: .
environment:
- MYSQL_USER=userExample
- MYSQL_PASSWORD=passwordExample
network_mode: "host"
第二次启动:docker-compose up
第三,使用localhost
作为数据库主机名从主机进行连接。
答案 1 :(得分:1)
您以错误的方式使用了Dockerfile,从而使映像与容器混淆。
RUN
命令将失败,因为此时容器甚至不存在,因此没有任何可连接的东西,因此您根本不需要设置Dockerfile。
如果migrate.sql
仅需要使用干净的数据库读取一次,则可以将文件挂载在/docker-entrypoint-initdb.d/migrate.sql
上。您可以在docker-mysql documentation上了解此目录。
如果需要从现有数据库中导入它,则只需从主机或另一个容器中运行import命令。
我不建议使用嵌入式数据库创建mysql映像,因为重新启动容器时所有更改都将丢失。