À partir d'un conteneur Python lancé avec Docker J'étais accro à diverses choses lors de l'utilisation du conteneur MySQL, je vais donc le résumer.
3.5.2-alpine
)mysql
.Lors du développement à l'aide de Docker Je pense qu'il y a de nombreux cas où Alpine Linux est utilisé pour réduire le poids du conteneur. Bien que légères et rapides à démarrer, de nombreuses commandes doivent être installées seules.
Lors de la connexion à un conteneur MySQL depuis un conteneur Alpine Linux sur la ligne de commande
Bien sûr, la commande mysql
n'est pas incluse
Installez à l'aide de l'outil de gestion de packages apk comme suit.
Installer le client
$ apk update
$ apk add mariadb-client
Bien que ce soit mariadb
, il peut être utilisé avec MySQL sans aucun problème.
Je n'ai pas gardé le serveur DB sur localhost, donc j'ai installé uniquement le client.
Vous pouvez maintenant utiliser MySQL sur la ligne de commande en entrant la commande comme suit.
Commande de connexion (veuillez remplacer le nom d'hôte et le nom d'utilisateur)
$ mysql -h {host} -u {user} -p
MySQLdb
n'est pas disponible et la base de données n'est pas accessible à partir du scriptLors du développement d'une application Web avec Python Je pense que vous accédez souvent à la base de données en utilisant SQLAlchemy comme ORM. (L'exception est Django car il a son propre ORM)
D'après la documentation Flask-SQL Alchemy, j'ai d'abord écrit:
config.py
SQLALCHEMY_DATABASE_URI = 'mysql://username:password@server/db'
Une erreur se produit si vous accédez à la base de données avec ce paramètre.
Journal des erreurs
$ ImportError: No module named 'MySQLdb'
J'essaye donc l'installation comme ci-dessous, mais cela ne fonctionne pas.
Installer MySQLdb
$ pip install MySQL-python
Journal des erreurs
$ ImportError: No module named 'ConfigParser'
Un rapide coup d'œil à ce point montre que MySQLdb n'est pas disponible dans Python 3. J'ai vu des façons de l'utiliser dans certains articles Il n'y a aucune raison de s'en tenir à MySQLdb cette fois, nous allons donc considérer d'autres bibliothèques.
Si vous regardez la documentation SQL Alchemy, cela ressemble à [PyMySQL](https: // github.com/PyMySQL/PyMySQL) est le finaliste J'ai choisi cela car la compatibilité ne semble pas poser de problème (bien que la lecture en anglais soit ambiguë). J'ai installé et modifié la configuration comme suit et confirmé le fonctionnement normal.
Installez PyMySQL
$ pip install PyMySQL
config.py
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://username:password@server/db'
Si vous utilisez Python, vous serez bloqué avec le traitement japonais. Cette fois, l'erreur suivante s'est produite lors de l'insertion d'une chaîne de caractères japonais dans la base de données.
Erreur
sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE9\\x98\\xBF\\xE4\\xBA\\x95...' for column 'name' at row 1")
Ce qui suit est spécifié dans la ligne shebang du script à utiliser.
xxx.py
# -*- coding: utf-8 -*-
S'il y a un autre problème, je pense que c'est le réglage du code de caractère du côté MySQL.
Vérifiez les paramètres de la ligne de commande mysql
comme suit:
Vérifiez les paramètres MySQL
MySQL [(none)]> SHOW VARIABLES LIKE 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
Il est vraiment suspect que «latin1» soit mélangé. Il n'y a pas de mérite particulier tel qu'il est, alors je voudrais le changer.
Je pense que le moyen le plus décent est de définir my.cnf
Cette fois, j'exécute le serveur MySQL en tant que conteneur, il est donc difficile de changer.
Donc, j'ai pensé à configurer cela lors de la configuration du conteneur en premier lieu.
À la suite de l'enquête, les pages suivantes ont été très utiles. Spécifiez le code de caractère dans l'image officielle MySQL de Docker Image officielle de MySQL
Many configuration options can be passed as flags to mysqld. This will give you the flexibility to customize the container without needing a cnf file.
(Traduction japonaise)
Vous pouvez passer de nombreuses options à mysqld comme indicateurs.
Cela vous donne la flexibilité de personnaliser votre conteneur sans avoir besoin d'un fichier cnf
.
Parce que docker-compose est utilisé dans mon environnement
Ajoutez la description suivante à docker-compose.yml
.
docker-compose.yml
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
Vérifiez à nouveau les paramètres MySQL.
Vérifiez les paramètres MySQL
MySQL [(none)]> SHOW VARIABLES LIKE 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
character_set_database
et character_set_server
ont changé en ʻutf-8`.
J'ai pu insérer le japonais en toute sécurité dans cet état.
Il y a quelques problèmes dus à la création d'un serveur DB avec un conteneur,
Puisque l'environnement peut être créé simplement en cliquant avec la commande docker-compose
Une fois que vous vous y êtes habitué, vous pouvez accélérer le développement.
En passant, j'ai introduit trois points auxquels je suis accro cette fois. Il est souvent possible qu'il augmente à mesure que vous l'utiliserez à l'avenir.
Recommended Posts