エラー: 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
コメント