关键词搜索

源码搜索 ×
×

MySQL基础:在容器启动时动态设定参数

发布2019-06-14浏览1687次

详情内容

这篇文章介绍一下MySQL镜像启动时候通过command方式动态修改参数的方法,并以MySQL镜像缺省字符集修改的实际问题对应作为示例进行使用说明。

应用场景:
MySQL或者Mariadb官方镜像缺省的字符集为latin1,在前面的文章中介绍了对于全局/数据库/表/字段的字符集的查看/设定/修改的多种方式,但是大多方式都是在容器启动之后,或者是需要修改my.cnf的配置文件,从而可能需要修改镜像,把镜像的配置卷挂出来,然后修改设定文件,这些都需要一些额外的手动操作。

有关MySQL字符集查看和设定的内容可参看:

事前环境

可参看Easypack的Redmine的docker-compose.yml文件确认缺省状态下的MySQL数据库的字符集设定。文件内容如下所示:

version: '2'

services:

  redmine:
    image: liumiaocn/redmine
    ports:
      - 3000:3000
    environment:
      REDMINE_DB_MYSQL: redmine
      REDMINE_DB_PASSWORD: secret
    depends_on:
      - redminedb
    restart: never

  redminedb:
    image: liumiaocn/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: redmine
    restart: never

    链接地址:
    https://github.com/liumiaocn/easypack/blob/master/containers/alpine/redmine/docker-compose.yml

    启动命令:docker-compose up -d

    • 字符集确认
      进入到启动的MySQL容器中,可以看到相关设定均为latin1
    liumiaocn:redmine liumiao$ docker exec -it redmine_redminedb_1 sh
    # mysql -uroot -psecret
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server version: 8.0.0-dmr MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> show variables like '%character%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    
    mysql> 
    
      22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    设定方法

    通过command可以传入相关参数,这里以设定上述latin1相关的选项为utf8为例进行说明,这里使用这样的一个docker-compose的设定文件

    liumiaocn:redmine liumiao$ cat docker-compose.utf8.yml 
    version: '2'
    
    services:
    
      redmine:
        image: liumiaocn/redmine
        ports:
          - 3000:3000
        environment:
          REDMINE_DB_MYSQL: redminedb
          REDMINE_DB_PASSWORD: secret
        depends_on:
          - redminedb
        restart: "no"
    
      redminedb:
        image: liumiaocn/mysql
        environment:
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: redmine
        command: ['mysqld','--character_set_server=utf8'] 
        restart: "no"
    liumiaocn:redmine liumiao$ 
    
      22
    • 23
    • 24

    启动命令:docker-compose -f docker-compose.utf8.yml up -d

    结果确认

    liumiaocn:redmine liumiao$ docker exec -it redmine_redminedb_1 sh
    # mysql -uroot -psecret
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 8.0.0-dmr MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> show variables like '%character%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    
    mysql>
    
      22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    Redmine镜像方式启动服务经常碰到的中文问题之一就是由于所使用的数据库创建的时候未指定utf8所导致,此处将MySQL的缺省设定设定未utf8,则可以达到曲线对应的目的。

    mysql> show create database redmine;
    +----------+------------------------------------------------------------------+
    | Database | Create Database                                                  |
    +----------+------------------------------------------------------------------+
    | redmine  | CREATE DATABASE `redmine` /*!40100 DEFAULT CHARACTER SET utf8 */ |
    +----------+------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载