次の$ docker-compose down
を指定して.yml
を実行した場合、MySQLデータが持続するようには見えません。
version: '2'
services:
# other services
data:
container_name: flask_data
image: mysql:latest
volumes:
- /var/lib/mysql
command: "true"
mysql:
container_name: flask_mysql
restart: always
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
MYSQL_USER: 'test'
MYSQL_PASS: 'pass'
volumes_from:
- data
ports:
- "3306:3306"
私のdata
コンテナではvolumes: - /var/lib/mysql
を使ってそれをmysqlがコンテナにデータを保存するローカルマシンディレクトリにマッピングしているので、このマッピングのためにコンテナが破壊されてもデータは存続するはずです。そしてmysql
コンテナはデータベースへの単なるクライアントインタフェースであり、volumes_from: - data
のためにローカルディレクトリを見ることができます。
この答えを試みたがうまくいかなかった。 Dockerで構成された永続的なデータの問題
編集
以下のように.yml
を変更してdir ./data
を作成しましたが、docker-compose up --build
を実行するとmysql
コンテナが起動しないというエラーが表示されます
data:
container_name: flask_data
image: mysql:latest
volumes:
- ./data:/var/lib/mysql
command: "true"
mysql:
container_name: flask_mysql
restart: always
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
MYSQL_USER: 'test'
MYSQL_PASS: 'pass'
volumes_from:
- data
ports:
- "3306:3306"
flask_mysql | mysqld: Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)
flask_mysql | 2016-08-26T22:29:21.182144Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
flask_mysql | 2016-08-26T22:29:21.185392Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting.
データコンテナは余分な回避策です。 データボリューム がうまくいくでしょう。 docker-compose.yml
を次のように変更します。
version: '2'
services:
mysql:
container_name: flask_mysql
restart: always
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
MYSQL_USER: 'test'
MYSQL_PASS: 'pass'
volumes:
- my-datavolume:/var/lib/mysql
volumes:
my-datavolume:
Dockerが/var/lib/docker/volumes
フォルダーにボリュームを作成します。このボリュームはdocker-compose down -v
と入力していない限り持続します。
3つの方法があります。
最初の方法
あなたはあなたのホストマシン上にmysqlデータを保存するためのディレクトリを指定する必要があります。その後、データコンテナを削除できます。あなたのMySQLデータはあなたのローカルファイルシステムに保存されます。
MySQLコンテナの定義は次のようになります。
mysql:
container_name: flask_mysql
restart: always
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
MYSQL_USER: 'test'
MYSQL_PASS: 'pass'
volumes:
- /opt/mysql_data:/var/lib/mysql
ports:
- "3306:3306"
2番目の方法
docker-compose down
と入力する前にデータコンテナをコミットします。
docker commit my_data_container
docker-compose down
3番目の方法
docker-compose stop
の代わりにdocker-compose down
を使用することもできます(その場合はコンテナーをコミットする必要はありません)。
MySQLデータ用に別のボリュームを作成する必要があります。
だからそれはこのようになります:
volumes_from:
- data
volumes:
- ./mysql-data:/var/lib/mysql
いいえ、/var/lib/mysql
はmysqlコンテナ内のパスであり、ホストマシン上のパスとは関係ありません。あなたのホストマシンはまったくMySQLを持っていないかもしれません。だから目標は、MySQLコンテナから内部フォルダを永続化することです。
実際にこれが道であり、あなたはこれが機能するための有効な道を述べるべきです。データディレクトリが現在のディレクトリにある場合はmy-data
の代わりに./my-data
を指定する必要があります。それ以外の場合はmysql
name__およびmariadb
name__にもエラーが発生します。
volumes:
./my-data:/var/lib/mysql