DockerでMySQL5.7コンテナを使う際の注意点

DB

エラー: Operating system error number 22 in a file operation

以下のスクリプトでLAMP環境を作成しようとするとできませんでした。

Dockerfile

$ cat Dockerfile
FROM php:7.2-apache-stretch
RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

docker-compose.yml

$ cat docker-compose.yml
version: '3'
services:
  app:
    build: ./
    volumes:
      - ./src:/var/www/html
    ports:
      - 80:80
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - 3306:3306
    volumes:
      - ./dbdata:/var/lib/mysql

起動してみると・・

$ docker-compose up -d
Creating lamp_mysql_1 ... done
Creating lamp_app_1   ... done
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
b7c0ff10d820        lamp_app            "docker-php-entrypoi…"   12 seconds ago      Up 9 seconds        0.0.0.0:80->80/tcp   lamp_app_1

appのコンテナのひとつしか動いていません。エラー内容を見ると、

$ docker logs -f lamp_mysql_1 
・
・
2020-12-10T02:49:31.774866Z 0 [ERROR] InnoDB: Operating system error number 22 in a file operation.
2020-12-10T02:49:31.774979Z 0 [ERROR] InnoDB: Error number 22 means 'Invalid argument'
2020-12-10T02:49:31.775018Z 0 [ERROR] InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation
2020-12-10T02:49:31.775050Z 0 [ERROR] InnoDB: Cannot continue operation. 

解決策:docker-composeのボリュームの書き方を変更

ボリュームは、Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組みです。権限か何か理由はよくわかりませんが、こちらを使えば動きました。
MySQLのデータをフォルダ内に持たないようにしました。

以下のようにdocker-compose.ymlのスクリプトを書き換えます。

$ cat docker-compose.yml
version: '3'
services:
  app:
    build: ./
    volumes:
      - ./src:/var/www/html
    ports:
      - 80:80
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - 3306:3306
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:

先ほどつくった、コンテナを削除

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                NAMES
b7c0ff10d820        lamp_app            "docker-php-entrypoi…"   45 seconds ago      Up 42 seconds               0.0.0.0:80->80/tcp   lamp_app_1
a00bb58b2e6d        mysql:5.7           "docker-entrypoint.s…"   45 seconds ago      Exited (3) 41 seconds ago                        lamp_mysql_1

$ docker stop lamp_app_1
$ docker stop lamp_mysql_1

$ docker rm lamp_app_1
$ docker rm lamp_mysql_1

先ほど作ったボリュームも削除(ボリュームが作られていたら・・。)

$ docker volume ls
DRIVER              VOLUME NAME
local               lamp_dbdata

$ docker volume rm lamp_dbdata
lamp_dbdata

作り直し

$ docker-compose up -d
Creating volume "lamp_dbdata" with default driver
Creating lamp_app_1   ... done
Creating lamp_mysql_1 ... done

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
0bec6c2f6e33        mysql:5.7           "docker-entrypoint.s…"   7 seconds ago       Up 4 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   lamp_mysql_1
67883803eb00        lamp_app            "docker-php-entrypoi…"   7 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp                  lamp_app_1

できました!!

エラー: — initialize specified but the data directory has files in it

こちらは、MySQLコンテナを作り直したときに、前回のコンテナのDBデータが残っているときに起きるものです。

解決策:ボリューム削除

$ docker volume ls
DRIVER              VOLUME NAME
local               lamp_dbdata

$ docker volume rm lamp_dbdata
lamp_dbdata

これでいけると思います・・。

その他: MySQLコンテナのデフォルトのrootパスワード確認

$ cat /var/lib/docker/containers/コンテナID/コンテナID-json.log |grep PASS

コメント

タイトルとURLをコピーしました