我正在尝试通过docker-compose up
我得到一个错误:
2002,“无法通过套接字'/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器”
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: 'slack_bot1'
MYSQL_USER: 'root'
MYSQL_PASSWORD: ''
MYSQL_ROOT_PASSWORD: '****'
volumes:
- /opt/slack_bot/mysql_data:/var/lib/mysql
redis:
image: "redis:alpine"
volumes:
- /opt/slack_bot/redis_data:/var/lib/redis
web:
build: .
command: python manage.py runserver 0.0.0.0:8001
ports:
- "8001:8001"
depends_on:
- db
Dockerfile
FROM python:3.7-alpine
ENV PYTHONUNBUFFERED 1
WORKDIR /home/slack_bot
ADD requirements.txt /home/slack_bot/
RUN set -e; \
apk add --no-cache --virtual .build-deps \
gcc \
libc-dev \
linux-headers \
mariadb-dev \
python3-dev \
;
RUN pip install -r requirements.txt
ADD . /home/slack_bot/
EXPOSE 8001
CMD ["python", "manage.py", "runserver", "0.0.0.0:8001"]
docker ps 日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68b61ca0ce74 slack_bot_web "python manage.py ru…" 8 minutes ago Up 32 seconds 0.0.0.0:8001->8001/tcp slack_bot_web_1
c5f254a527b0 mysql:5.7 "docker-entrypoint.s…" 8 minutes ago Up 34 seconds 3306/tcp, 33060/tcp slack_bot_db_1
4cbc1fa3765e redis:alpine "docker-entrypoint.s…" 15 minutes ago Up 33 seconds 6379/tcp slack_bot_redis_1
数据库的Django设置
'ENGINE': 'django.db.backends.mysql',
'NAME': 'slack_bot1',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '',
答案 0 :(得分:1)
在django设置中,将数据库主机保留为EMPTY,然后默认值为localhost
。使用localhost
时,mysql客户端驱动程序会将mysql服务器与unix socket
而非tcp
连接。
因此,对于您的情况,您需要将mysql容器中的unix socket
导出到卷,然后django应用容器利用此卷共享unix socket
。
下一步是您需要做的:
手动新建一个文件夹,以后将其作为卷共享您的unix套接字文件
(重要:您不能依靠docker-compose到此文件夹,您将遇到权限错误)
mkdir -p /tmp/slack_bot/mysqld && chmod -R 777 /tmp/slack_bot/mysqld
在您的docker-compose.yaml
中,向mysql
服务中再添加一个卷:
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: 'slack_bot1'
MYSQL_USER: 'root'
MYSQL_PASSWORD: ''
MYSQL_ROOT_PASSWORD: '****'
volumes:
- /opt/slack_bot/mysql_data:/var/lib/mysql
- /tmp/slack_bot/mysqld:/var/run/mysqld
在您的docker-compose.yaml
中,向web
服务中再添加一个卷:
web:
build: .
command: python manage.py runserver 0.0.0.0:8001
ports:
- "8001:8001"
depends_on:
- db
volumes:
- /tmp/slack_bot/mysqld:/run/mysqld
注意::在这里,您说接下来会收到错误/run/mysqld/mysqld.sock
,我不确定您是否将所有日志粘贴为最可能的/var/run/mysqld/mysqld.sock
,否则,如果错误为/var/run/mysqld/mysqld.sock
,则应将上述示例卷修改为- /tmp/slack_bot/mysqld:/var/run/mysqld
2002,“无法通过套接字'/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器”
有了上述,现在您的Web服务就可以共享mysql容器中的unix套接字了。
另外,将HOST
配置为db
,我认为这也可能是另一种解决方案,与使用unix socket
相比,只是tcp
要快得多。