MySQL(Dockerコンテナ)で日本語を扱うために設定したこと
MySQLにデータを登録しようとしたら、Pythonではテーブルに登録は出来ていたんですが、tsvで書き出したファイルをMySQLコンテナのシェルから一括で登録しようとしたところ、
試しにmysqlに入って1レコードだけ登録しようとしたら、どうやら全角文字が消える?みたいで、登録できませんでした。
日本語を入力して消えるのは、日本語環境が設定されてない
という事らしいです。GolangとPythonからは日本語の登録・取得は出来ていたので設定はしていませんでした。 色々方法があるみたいですが、私の場合はすんなりとは行かなくて、一応こんな感じで落ち着きました。
RUN apt-get updateの前にRUN apt-key adv –keyserver 〜を実行させればビルドが通りました。
因みに私は、コンテナの/var/lib/mysqlで設定しているフォルダの中身を消して対応してました。でもDBの中身も無くなるから、う〜んって感じだったんですよね。
以上になります
# mysqlimport -uroot -p --local gin_db predict_info.tsv Records: 372 Deleted: 0 Skipped: 372 Warnings: 1116こんな感じで全てスキップされてしまいデータが登録できませんでした。
試しにmysqlに入って1レコードだけ登録しようとしたら、どうやら全角文字が消える?みたいで、登録できませんでした。
日本語を入力して消えるのは、日本語環境が設定されてない
という事らしいです。GolangとPythonからは日本語の登録・取得は出来ていたので設定はしていませんでした。 色々方法があるみたいですが、私の場合はすんなりとは行かなくて、一応こんな感じで落ち着きました。
Dockerfile
FROM mysql:5.7
#RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 417B948D3F79CD19 \
RUN apt-get update \
&& apt-get -y install locales --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
RUN dpkg-reconfigure locales && \
locale-gen C.UTF-8 && \
/usr/sbin/update-locale LANG=C.UTF-8
ENV LC_ALL C.UTF-8
docker-compose.yml
mysql:
container_name: project-gin-mysql
image: mysql:5.7
build:
context: .
dockerfile: ./docker/database/Dockerfile
environment:
MYSQL_ROOT_PASSWORD: rootroot
MYSQL_DATABASE: gin_db
MYSQL_USER: myuser
MYSQL_PASSWORD: mypasswd
TZ: "Asia/Tokyo"
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
W: GPG error: 〜 NO_PUBKEY なエラーも発生
$ docker-compose up --build再ビルド中、Public Key のエラーも出ました。
W: GPG error: http://repo.mysql.com/apt/debian buster InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 417B948D3F79CD19Dockerfileではコメントにしてますが、
E: The repository 'http://repo.mysql.com/apt/debian buster InRelease' is not signed.
RUN apt-get updateの前にRUN apt-key adv –keyserver 〜を実行させればビルドが通りました。
Dockerコンテナの再作成でいつも認証のエラーが出るので
ついでですが、MySQLのコンテナ再作成ではいつも下記のエラー(ca-key.pem)が出るので、普通はどうやるんだろうと気になって調べてみました。因みに私は、コンテナの/var/lib/mysqlで設定しているフォルダの中身を消して対応してました。でもDBの中身も無くなるから、う〜んって感じだったんですよね。
Traceback (most recent call last):StackOverflowを見てみたら、Dockerのvolumeに設定したらいちいちpemファイルを削除しなくても大丈夫になりました。
File "site-packages/docker/utils/build.py", line 96, in create_archive
PermissionError: [Errno 13] Permission denied: '/home/toshiya/Work/WebSiteMaking/gin_redis_docker/docker/database/data.bak/ca-key.pem'
#MySQL Service
mysql:
container_name: project-gin-mysql
image: mysql:5.7
...
volumes:
- mysqldbvolume:/var/lib/mysql
- ./docker/database/my.cnf:/etc/mysql/conf.d/my.cnf
...
# Volumes
volumes:
mysqldbvolume:
driver: local
因みにvolumeの確認はこうやるみたいです。
docker volume ls/var/lib/docker/volumes この場所にあるみたいですが、rootオーナーでパーミッションが700なので、厳重に管理されてて簡単に扱えるフォルダではなさそうですね。しばらくどういう設定にするか悩みそうです。
以上になります