docker-compose 运行mysql中文乱码问题

解决方法一(已创建容器):
进入容器,编辑/etc/mysql/my.cnf文件,添加如下内容:

[mysqld]
character_set_server=utf8 
init_connect='SET NAMES utf8'

[mysql] 
default-character-set = utf8

[mysql.server] 
default-character-set = utf8

[mysqld_safe] 
default-character-set = utf8

[client] 
default-character-set = utf8

初始的my.cnf文件只有[mysqld]标签,其他标签自己手动添加。然后重启容器即可。

解决方法二(未创建容器):
拷贝一个my.cnf文件,在外部修改完后,构建镜像的时候直接通过dockerfile拷贝到容器里。

我使用的dockerfile如下:

FROM mysql:8.0.20

MAINTAINER zhangDocker

ENV TZ=Asia/Shanghai

RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

COPY ./my.cnf /etc/mysql/my.cnf

my.cnf如下:

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
character_set_server=utf8 
init_connect='SET NAMES utf8'

pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

[mysql] 
default-character-set = utf8

[mysql.server] 
default-character-set = utf8

[mysqld_safe] 
default-character-set = utf8

[client] 
default-character-set = utf8


PS:尝试过在docker-compose.yml文件里设置以下参数,但没起啥作用。

    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci

<think>我们正在讨论如何修改CTFd的docker-compose.yml文件以添加MySQL和Redis依赖。根据之前的上下文,我们知道默认的docker-compose.yml只包含CTFd服务,没有数据库和缓存服务。因此,我们需要手动添加这些服务。步骤:1.打开docker-compose.yml文件(位于CTFd项目根目录)。2.在services部分添加MySQL(或MariaDB)和Redis服务。3.修改CTFd服务,使其依赖于这些服务,并配置环境变量以连接MySQL和Redis。注意:CTFd官方推荐使用MySQL(或MariaDB)作为数据库,因为SQLite(默认)在并发下性能不佳。下面是一个修改后的docker-compose.yml示例(基于CTFd官方仓库的docker-compose.yml,并添加了MySQL和Redis服务):```yamlversion: '3'services:ctfd:build: .image: ctfd:latestrestart: alwaysports:-"8000:8000"environment:-DATABASE_URL=mysql+pymysql://ctfd:ctfdpassword@db/ctfd#使用MySQL,注意用户名、密码和数据库名- REDIS_URL=redis://cache:6379#使用Redisvolumes:- .data/CTFd/logs:/var/log/CTFd- .data/CTFd/uploads:/var/uploadsdepends_on:-db-cachedb:image: mariadb:10.5#也可以使用mysql:5.7restart:alwaysenvironment:- MYSQL_ROOT_PASSWORD=rootpassword#设置root密码,可选-MYSQL_USER=ctfd-MYSQL_PASSWORD=ctfdpassword-MYSQL_DATABASE=ctfdvolumes:- .data/mysql:/var/lib/mysql#持久化数据库cache:image: redis:6restart:alwaysvolumes:- .data/redis:/data#持久化Redis数据```解释:1.添加了两个新服务:`db`(使用MariaDB镜像)和`cache`(使用Redis镜像)。2.在`ctfd`服务中,通过`environment`设置环境变量:-`DATABASE_URL`:指定MySQL连接字符串,格式为`mysql+pymysql://<username>:<password>@<host>/<database>`- `REDIS_URL`:指定Redis连接字符串,格式为`redis://<host>:<port>`3.在`ctfd`服务的`depends_on`中声明依赖,确保先启动db和cache服务。4.为数据库和Redis配置了持久化卷,避免容器重启后数据丢失。重要提示: -请将上述环境变量中的密码(如`ctfdpassword`)替换为强密码。 -确保网络配置正确:默认情况下,DockerCompose会创建一个网络,服务之间可以使用服务名(如`db`和`cache`)进行通信。验证:启动服务后,可以通过以下命令检查日志:```bashdocker-composelogs ctfd```如果没有报错,且CTFd能够正常访问(通过http://localhost:8000),则说明配置成功。注意事项: -如果之前已经使用默认配置运行过CTFd(使用SQLite),那么在切换到MySQL之前需要迁移数据。但通常在新部署时不需要。 -确保DockerDockerCompose版本支持Compose文件版本3。参考:[CTFd官方文档](https://docs.ctfd.io/docs/deployment/docker)中提到了使用Docker部署,但默认配置不包含MySQL和Redis。因此,我们通过修改docker-compose.yml来添加这些服务。相关问题:1.如何为CTFd配置MySQL数据库的用户权限?2.CTFd使用Redis缓存哪些数据?如何验证Redis是否正常工作?3.如何备份CTFd的MySQL数据库和Redis数据?4.在docker-compose中,如何设置MySQL的字符集以避免乱码?5. CTFd在连接MySQL时出现连接错误,如何排查?</think>### 正确修改 CTFd 的 `docker-compose.yml` 添加 MySQL 和 Redis 依赖 以下是完整的修改步骤和配置示例,确保 CTFd 能正确连接 MySQL 和 Redis: #### 修改步骤 1. **定位文件** 进入 CTFd 项目目录: ```bash cd CTFd ``` 2. **编辑 `docker-compose.yml`** 使用文本编辑器修改文件: ```bash nano docker-compose.yml # 或 vim/vi ``` 3. **添加 MySQL 服务** 在 `services` 部分新增以下配置: ```yaml db: image: mysql:8.0 # 或 mariadb:10.5 environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: ctfd_db MYSQL_USER: ctfd_user MYSQL_PASSWORD: your_db_password volumes: - mysql_data:/var/lib/mysql # 数据持久化 restart: always ``` 4. **添加 Redis 服务** 在 `services` 部分新增以下配置: ```yaml redis: image: redis:6 command: redis-server --requirepass your_redis_password # 设置密码 volumes: - redis_data:/data # 数据持久化 restart: always ``` 5. **修改 CTFd 服务配置** 更新 `ctfd` 服务的环境和依赖: ```yaml ctfd: build: . environment: DATABASE_URL: mysql+pymysql://ctfd_user:your_db_password@db/ctfd_db REDIS_URL: redis://:your_redis_password@redis:6379/0 CACHE_REDIS_URL: redis://:your_redis_password@redis:6379/1 depends_on: - db - redis ports: - "8000:8000" ``` 6. **添加卷定义** 在文件末尾添加卷声明: ```yaml volumes: mysql_data: redis_data: ``` #### 完整配置示例 ```yaml version: '3.8' services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secure_root_pass MYSQL_DATABASE: ctfd_db MYSQL_USER: ctfd_user MYSQL_PASSWORD: user_pass123 volumes: - mysql_data:/var/lib/mysql restart: always redis: image: redis:6 command: redis-server --requirepass redis_pass456 volumes: - redis_data:/data restart: always ctfd: build: . environment: DATABASE_URL: mysql+pymysql://ctfd_user:user_pass123@db/ctfd_db REDIS_URL: redis://:redis_pass456@redis:6379/0 CACHE_REDIS_URL: redis://:redis_pass456@redis:6379/1 depends_on: - db - redis ports: - "8000:8000" volumes: - uploads:/var/uploads volumes: mysql_data: redis_data: uploads: ``` #### 关键配置说明 1. **数据库连接** - `DATABASE_URL` 格式:`mysql+pymysql://<用户>:<密码>@<服务名>/<数据库名>` - 服务名 `db` 对应 MySQL 服务定义名称 2. **Redis 连接** - `REDIS_URL` 格式:`redis://:<密码>@<服务名>:<端口>/<数据库编号>` - 服务名 `redis` 对应 Redis 服务定义名称 3. **持久化存储** - MySQL 数据存储在 `mysql_data` 卷 - Redis 数据存储在 `redis_data` 卷 - 上传文件存储在 `uploads` 卷 #### 验证部署 ```bash docker-compose up -d --build docker-compose logs ctfd # 查看日志确认无报错 ``` 访问 `http://localhost:8000` 应显示 CTFd 安装界面。 #### 常见问题解决 - **连接失败**:检查日志中的错误信息,确保: - MySQL/Redis 容器已启动:`docker-compose ps` - 密码和服务名匹配 - 网络互通:`docker network inspect ctfd_default` - **性能优化**: 在 MySQL 服务中添加: ```yaml command: --innodb-buffer-pool-size=512M --max_connections=200 ``` --- ### 相关问题 1. **如何为 CTFd 配置 HTTPS 访问?** 2. **CTFd 如何集成 SMTP 邮件服务?** 3. **如何备份 CTFd 的 MySQL 数据库和 Redis 数据?** 4. **CTFd 部署后如何更新到最新版本?** 5. **如何优化 CTFd 在高并发场景下的性能?**[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值