2016-08-26 31 views
35

我似乎无法获得MySQL的数据要坚持,如果我有以下.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" 

我的理解运行$ docker-compose down的是,在使用volumes: - /var/lib/mysqldata容器将其映射到我的地方机器目录,其中mysql将数据存储到容器,并且由于此映射,即使容器被销毁,数据也应该保留。而mysql容器只是一个客户端接口到数据库,并可以看到本地目录,因为volumes_from: - data

试图解答这个问题,但它不起作用。 Docker-Compose Persistent Data Trouble

编辑

改变了我的.yml如下图所示,创建的目录./data但现在当我运行docker-compose up --buildmysql容器无法启动抛出错误说

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

请参阅[我的码头文章](https://martin-thoma.com/docker/)和[我最小的示例](https:// github。com/MartinThoma/flask_mysql_dockerized) –

回答

58

的数据容器是一个多余的解决方法。 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: 

泊坞窗将创建在/var/lib/docker/volumes文件夹你的音量。只要你不打字,这个卷就会一直存在docker-compose down -v

+1

这似乎已修复它。谢谢。 – Adam

+8

从MySQL 5.7.6开始,使用mysql的Docker镜像会(再次)出现[权限问题](https://github.com/docker-library/mysql/issues/69)。您可以使用Docker卷的'mariadb' Docker镜像,[完美工作](https://github.com/docker-library/mysql/issues/69#issuecomment-269537249)。 – Peterino

4

你必须创建一个为mysql数据分开卷。

因此,这将是这样的:

volumes_from: 
    - data 
volumes: 
    - ./mysql-data:/var/lib/mysql 

没有,/var/lib/mysql是你的mysql容器内的路径,并没有任何与你的主机上的路径。你的主机甚至可能根本没有mysql。所以我们的目标是从mysql容器中保存一个内部文件夹。

+0

这不会和将数据容器下的'volumes'更改为你放在'volumes'下的'volume'并且'mysql'只具有'volumes_from:data''不同吗?也试图这个和新的错误。说dir存在但不可写,'mysql'容器不会运行。 – Adam

+0

当然你必须创建一个路径为./mysql-data的本地文件夹(或者你在分号之前放置的任何东西) –

+0

看我的编辑。在你评论之前没有得到它。但确实创建了本地目录。看起来现在有一个许可问题。 – Adam

14

有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" 

方式二是打字docker-compose down前提交数据容器:

docker commit my_data_container 
docker-compose down 

第三条道路。您也可以使用docker-compose stop代替docker-compose down(那么你并不需要提交集装箱)

+0

我不能只是'卷: -/var/lib/mysql',因为它映射'HOST:CONTAINER',如果你没有指定w /冒号它映射相同的目录? – Adam

+0

不是。不幸的是,在这种情况下,docker将这个容器目录映射到像'/ var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535' –

+0

这样的随机主机文件夹好吧我以为'卷:/ var/lib/mysql'等同于'volumes: -/var/lib/mysql:/ var/lib/mysql' – Adam