Docker-Compose стійкі дані MySQL


156

Я не можу отримати дані MySQL, щоб вони зберігалися, якщо я працюю $ docker-compose downз наступним.yml

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контейнер є просто клієнтським інтерфейсом в db і може бачити локальний каталог черезvolumes_from: - data

Спробувала цю відповідь, і це не вийшло. Стійкі проблеми даних Docker-Compose

EDIT

Змінив моє , .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.

Відповіді:


223

Контейнер даних - це зайве вирішення. Об'єм даних зробив би для вас хитрість. Змініть 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


18
Починаючи з MySQL 5.7.6, знов виникнуть проблеми з дозволом на mysqlзображення Docker. Ви можете замість цього використовувати mariadbзображення Docker, яке бездоганно працює з томами Docker.
Петерино

Це рішення спрацювало на мене. Кілька бічних приміток / рекомендацій: 1. Коли ви використовуєте вищевказану конфігурацію в docker-compose.yml і розгортаєте службовий стек за допомогою "докерного стека розгортання -c docker-compose.yml mystack", не потрібно створювати том вручну, він буде створений як / var / lib / docker / volumes / mystack_my-datavolume автоматично для вас (зауважте, що він додає "mystack_" до назви тома). 2. Мені не потрібно було змінювати дозволи на свій каталог. Навіть якщо у мене в контейнері є файли, що належать mysql: root, вони були створені як 27: root на моєму хості Docker без проблем.
Joey Cote

10
Чому ви коли-небудь хочете зберігати його, var/lib/docker/volumesа не мати каталог у своїй папці проекту data/mysql?
Хрещений батько

@TheGodfather Моя здогадка, якщо ви не хочете розгортати дані MySQL на виробничій машині; в іншому випадку це дуже обгрунтована ідея, що тримає все разом.
Дункан

1
@louhow Я думаю, тому що я відчуваю себе впевненіше, коли всі частини мого додатка та даних зберігаються якось разом, і я не маю залежностей від деякого обсягу звідкись
The Godfather

53

Існує 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(тоді вам не потрібно вводити контейнер)


Не можу я просто так, volumes: - /var/lib/mysqlбо він відображає карти, HOST:CONTAINERі якщо ви не вказуєте w / a двокрапки, він відображає той самий dir?
Адам

Ні. на жаль, у цьому випадку докер переносить цей каталог контейнерів у випадкову папку хоста на кшталт/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Бухаров Сергій

Гаразд, я думав, що volumes: - /var/lib/mysqlце рівнозначноvolumes: - /var/lib/mysql:/var/lib/mysql
Адаму,

ваш третій спосіб не працюватиме, оскільки докер не вводить дані з томів у зображення. дивіться github.com/moby/moby/isissue/6999
Охмен

13

Вам потрібно створити окремий том для даних mysql.

Так буде виглядати приблизно так:

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

І ні, /var/lib/mysqlце шлях до вашого контейнера mysql і не має нічого спільного з шляхом на вашій хост-машині. Ваша хост-машина може взагалі не мати mysql. Отже, мета - зберегти внутрішню папку з контейнера mysql.


Чи не буде це нічим не відрізняється від міняю volumesв контейнері даних, що ви поклали під вашим volumesі просто було volumes_from: - dataдля mysql? Також спробували це і нову помилку. Каже, dir існує, але він не може бути записаний, і mysqlконтейнер не працюватиме.
Адам

Звичайно, вам потрібно створити локальну папку з контуром ./mysql-data (або що б ви не поставили перед крапкою з комою)
Дмитро Малишенко

Дивіться мою редакцію. Не ввійшов до цього, перш ніж ви коментували. Але створив місцевий реж. Схоже, зараз існує проблема з дозволом.
Адам

ПОМИЛКА: Сервіс "mysql" збирає томи з "даних", що не є назвою послуги чи контейнера.
Массіміліано Аріоне

10

Насправді це шлях, і вам слід згадати дійсний шлях для цього. Якщо ваш каталог даних знаходиться в поточному каталозі, то замість my-dataвас слід згадати ./my-data, інакше він дасть вам таку помилку mysqlі в mariadb.

volumes:
 ./my-data:/var/lib/mysql
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.