web-dev-qa-db-fra.com

Comment changer le jeu de caractères par défaut de mysql en utilisant docker-compose?

Lorsque j'enregistre la chaîne de chinois, mysql génère l'erreur "Valeur d'exception:
(1366, "Valeur de chaîne incorrecte: '\ xE5\xB0\x8F\xE6\x98\x8E' pour la colonne 'nom' à la ligne 1") ", je vérifie le caractère de mysql, cela montre ceci:

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)

Et mon docker-compose.yml est en tant que boursier:

web:
    image: yetongxue/docker_test:1.2
    links:
      - "db"
    ports:
      - "8100:8000"
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/media:/root/media"
    restart: always

db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: qwerasdf
      MYSQL_DATABASE: docker_db
    restart: always
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/db:/var/lib/mysql"

Je sais comment définir le caractère de mysql avec my.cnf, mais comment puis-je le faire dans le docker-compose.yml? Quelqu'un le sait? Merci!

12
xander-ye

Vous pouvez soit créer votre propre image mysql où vous modifiez my.cnf, soit modifier la commande qui démarre le démon de mysql avec --character-set-server=utf8mb4 et --collation-server=utf8_unicode_ci.

web:
    image: yetongxue/docker_test:1.2
    links:
      - "db"
    ports:
      - "8100:8000"
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/media:/root/media"
    restart: always

db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: qwerasdf
      MYSQL_DATABASE: docker_db
    restart: always
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/db:/var/lib/mysql"
    command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']

Je recommande d'utiliser utf8mb4, car il peut stocker jusqu'à "4 octets par caractère multi-octets" ( https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html =)

17
Javier Arias

Le fichier de composition est utilisé pour exécuter des conteneurs (et peut créer des images). Vous ne pouvez pas personnaliser les images à l'intérieur du fichier docker-compose. Vous devez créer une image personnalisée qui étend l'image mysql. Créez un Dockerfile:

FROM mysql:5.7
RUN <command to update my.cnf>

Construisez ensuite cette image:

docker build -t <image-name> .

Mettre à jour le fichier de composition:

db:
    image: <image-name-specified-above>
0
yamenk

Si vous souhaitez créer votre propre image Docker avec les paramètres ci-dessus, au lieu de les spécifier dans Docker-compose, vous pouvez le faire comme suit:

FROM mysql:5.5.60

RUN ln -sf /usr/share/zoneinfo/Europe/London /etc/localtime

VOLUME ["/docker-entrypoint-initdb.d"]

CMD ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_general_ci", "--skip-character-set-client-handshake"]
0
Javier Arias