如果我使用以下$ 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-Compose Persistent Data Trouble
修改
如下所示更改了我的.yml
并创建了一个目录./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.
答案 0 :(得分:145)
数据容器是一个多余的解决方法。 Data-volumes会为你做到这一点。将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
答案 1 :(得分:35)
有三种方式:
第一种方式
您需要指定在主机上存储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"
第二种方式
在输入docker-compose down
之前提交数据容器:
docker commit my_data_container
docker-compose down
第三种方式
此外,您可以使用docker-compose stop
代替docker-compose down
(然后您不需要提交容器)
答案 2 :(得分:9)
您必须为mysql数据创建单独的卷。
所以它看起来像这样:
volumes_from:
- data
volumes:
- ./mysql-data:/var/lib/mysql
不,/var/lib/mysql
是mysql容器中的路径,与主机上的路径无关。您的主机甚至可能根本没有mysql。因此,目标是从mysql容器中持久保存内部文件夹。
答案 3 :(得分:4)
除了@Ohmen的答案,您还可以添加一个Copyright 1986-2019, Inc. All Rights Reserved.
Design Information
-----------------------------------------------------------------------------------------------------------------
| Version : (lin64) Build 2729669 Thu Dec 5 04:48:12 MST 2019
| Date : Wed Aug 26 00:46:08 2020
| Host : running 64-bit Red Hat Enterprise Linux Server release 7.8
| Command : college report
| Design : college
| Device : laptop
| Design State : in construction
-----------------------------------------------------------------------------------------------------------------
Table of Contents
-----------------
1. Information by Hierarchy
1. Information by Hierarchy
---------------------------
+----------------------------------------------+--------------------------------------------+------------+------------+---------+------+-----+
| colleges | Module | Total mems | book IDs_1 | canteen | BUS | UPS |
+----------------------------------------------+--------------------------------------------+------------+------------+---------+------+-----+
| block_ABC_top | (top) | 44 | 23 | 8 | 8 | 8 |
| (block_ABC_top_0) | block_ABC_top_0 | 5 | 5 | 5 | 2 | 9 |
+----------------------------------------------+--------------------------------------------+------------+------------+---------+------+-----+
标志以在docker compose之外创建数据量。这样,docker compose不会尝试创建它。同样,如果发生with open ("utility.txt", 'r') as f1:
for line in f1:
if data[x] in line:
line_values = line.split('|')
if (int(line_values[4]) == 23 or int(line_values[7]) == 8):
filecheck = fullpath + "/" + filenames[x]
print filecheck
#print "check file "+ filenames[x]
x = x + 1
f1.close()
,您也不必担心丢失数据量内的数据。
下面的示例来自official page。
external
答案 4 :(得分:2)
实际上这是路径,你应该提到一个有效的路径。如果你的数据目录在当前目录中,那么你应该提到my-data
而不是./my-data
,否则它会在mysql
和mariadb
中给你错误。
volumes:
./my-data:/var/lib/mysql
答案 5 :(得分:1)
首先,您需要使用删除所有旧的mysql数据
docker-compose down -v
之后,在docker-compose.yml中添加两行
volumes:
- mysql-data:/var/lib/mysql
和
volumes:
mysql-data:
您的最终docker-compose.yml看起来像
version: '3.1'
services:
php:
build:
context: .
dockerfile: Dockerfile
ports:
- 80:80
volumes:
- ./src:/var/www/html/
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- mysql-data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
volumes:
mysql-data:
之后使用此命令
docker-compose up -d
现在,您的数据将保持不变,即使使用此命令也不会被删除
docker-compose down
额外:-但如果要删除所有数据,则将使用
docker-compose down -v