如何使用 docker compose 使用 utf-8 设置 mysql?

Posted

技术标签:

【中文标题】如何使用 docker compose 使用 utf-8 设置 mysql?【英文标题】:How to setup mysql with utf-8 using docker compose? 【发布时间】:2018-02-10 18:41:53 【问题描述】:

我正在尝试让我的 mysql 映像以 utf-8 编码运行。我的 docker-compose 文件如下所示:

version: '2'
services:
  db:
    container_name: zoho-grabber-db-development
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=topsecret
      - MYSQL_DATABASE=development
      - MYSQL_USER=devuser
      - MYSQL_PASSWORD=secure
    ports:
      - "3306:3306"
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci

当我运行它时,它会说

$ docker-compose -f docker-compose.development.yml up
Removing zoho-grabber-db-development
Recreating 1b341fd7916e_1b341fd7916e_zoho-grabber-db-development

ERROR: for db  Cannot start service db: oci runtime error: container_linux.go:247: starting container process caused "exec: \"mysqld\": executable file not found in $PATH"
ERROR: Encountered errors while bringing up the project.

为什么找不到mysqld?以及如何实现我的目标?

【问题讨论】:

【参考方案1】:

当在docker-compose.yml 中使用command 时,它会覆盖默认的commandentrypoint,如docker-compose documentation 中所述。为了实现您的目标,我建议您将my.cnf 挂载为卷,如“使用自定义 MySQL 配置文件”部分下的docker image's readme 中所述。

所以从你的 docker-compose 中删除 command 并添加 volumes 例如。

...
volumes:
  - mycustom.cnf:/etc/mysql/conf.d/custom.cnf
...

并且容器将包含您的自定义配置作为服务器的配置

Edit-1

以下是您需要的自定义配置

mycustom.cnf

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

【讨论】:

添加了完成答案所需的配置 @Norbert Egger 还有一个“没有 cnf 文件的配置”部分,但我不确定这将如何应用于 docker-compose。也许对手动运行很方便 谢谢,现在可以使用了!我已经清理了我的 docker(图像和容器),然后重建了所有东西并且它工作了。【参考方案2】:

对于这个问题的新手,我可以通过从 command: mysqld ... 中删除 mysqld 来使其正常工作,如下所示:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8 --collation-server=utf8_general_ci
    restart: always
    environment:

这与documentation for the official MySQL image 中的方式相同,在 ... 部分下通过 docker stack deploy 或 docker-compose


作为旁注,您几乎从不想要在 MySQL 中进行utf8 编码;你需要utf8mb4。有关更多信息,请参阅此问答:What is the difference between utf8mb4 and utf8 charsets in MySQL?

【讨论】:

这可能是最快和最简单的解决方案。在我这边,我只需要 --character-set-server=utf8 --collation-server=utf8_general_ci 而没有 --default-authentication-plugin

以上是关于如何使用 docker compose 使用 utf-8 设置 mysql?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 docker-compose 在 docker 容器之间建立依赖关系 [重复]

如何使用 docker-compose 将容器部署到谷歌云?

如何使用来自其他目录的 docker-compose 环境变量

如何使用 docker compose 卷挂载 windows 文件夹?

如何使用 docker-compose 重启单个容器

如何使用可访问的 docker-compose 设置特定的 IP 地址