Кажется, мне не удается сохранить данные 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 с использованием томов: - / var / lib / mysql отображает его в каталог моих локальных машин, где mysql хранит данные в контейнере и из-за это сопоставление данных должно сохраняться, даже если контейнеры будут уничтожены. А контейнер mysql - это просто клиентский интерфейс в базе данных и может видеть локальный каталог из-за volume_from: - data

Попытался ответить, но ничего не вышло.Проблема с сохраняемыми данными Docker-Compose

ИЗМЕНИТЬ

Изменил мой .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.

Adam

Ответов: 6

Ответы (6)

Контейнер данных - излишний обходной путь.Объемы данных подойдут для вас. Измените свой 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 / volume. Этот том сохраняется, пока вы не набираете 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"

Второй способ

Было бы зафиксировать контейнер данных перед вводом docker-compose down:

docker commit my_data_container
docker-compose down

Третий способ

Также вы можете использовать docker-compose stop вместо docker-compose down (тогда вам не нужно фиксировать контейнер)

В дополнение к ответу от @Ohmen вы также можете добавить флаг external для создания тома данных вне docker compose. Таким образом, docker compose не будет пытаться его создать. Также вам не придется беспокоиться о потере данных внутри тома данных в случае $ docker-compose down -v. Пример ниже взят с официальной страницы .

version: "3.8"

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true

На самом деле это путь, и вы должны указать допустимый путь, чтобы это сработало. Если ваш каталог данных находится в текущем каталоге, то вместо my-data вы должны указать . / My-data, иначе вы получите эту ошибку в mysqlа также mariadb.

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

Вам необходимо создать отдельный том для данных mysql.

Так это будет выглядеть:

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

И нет, / var / lib / mysql - это путь внутри вашего контейнера mysql и не имеет ничего общего с путем на вашем хост-компьютере. На вашем хост-компьютере может вообще не быть mysql. Итак, цель - сохранить внутреннюю папку из контейнера mysql.

сначала вам нужно удалить все старые данные 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

2022 WebDevInsider