Как я могу сохранить свою базу данных, но изменить код в docker-compose? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть веб-сервис Python + MySQL, работающий на капле Digital Ocean. Когда я обновил код в проекте на своем локальном компьютере, я хочу, чтобы изменения происходили и в дроплете (в производстве). Поэтому для развертывания я делаю следующее:

$ ssh root@12.34.56.78
# cd project
# git pull
# docker-compose down
# docker-compose build
# docker-compose up -d

После этого моя база данных пуста. В нем нет ни одной из моих таблиц. Как я могу обновить код, который работает, но не потерять данные?

Мой код

Структура проекта

.
├── db
├── docker-compose.yml
└── web
    ├── Dockerfile
    ├── project
    │   ├── app.py
    │   ├── __init__.py
    │   ├── blueprint1
    │   ├── blueprint2
    │   ├── models.py
    │   ├── static
    │   ├── templates
    │   └── _version.py
    ├── Makefile
    ├── migrations
    ├── README.md
    ├── setup.cfg
    ├── setup.py
    ├── start.sh
    ├── tests
    └── tox.ini

докер-compose.yml

version: "2"
services:
  db:
    image: mysql:5.7
    ports:
      - "32000:3306"
    environment:
      MYSQL_DATABASE: ***
      MYSQL_ROOT_PASSWORD: ***
    volumes:
      - ./db:/docker-entrypoint-initdb.d/:ro
  app:
    build: ./web
    links:
      - db
    ports:
      - "5000:5000"
    environment:
      MYSQL_PORT: 32000

Dockerfile

FROM python:3.7-slim

# Copy projects code
RUN apt-get update && apt-get install -y git
COPY . /opt/app
WORKDIR /opt/app
RUN pip install -e . --no-cache-dir

# Start app
ENV ENV=prod
EXPOSE 5000
ENTRYPOINT ["sh", "start.sh"]
CMD ["/opt/app/start.sh"]

Что я пробовал

# This killed my data:
$ docker-compose up -d --build app

# This did NOT update the code in app:
# 1
$ docker-compose stop app && docker-compose up -d app
# 2
$ docker-compose up -d --no-deps --build app

Ответы [ 4 ]

1 голос
/ 12 июня 2019

Вы должны создать именованный том для своей базы данных, например:

version: '3'

services:    
  mysql:
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Теперь вы можете выполнять safly run docker-compose stop или docker-compose down, не теряя свои данные на томе mysql_data.Только при запуске docker-compose down -v он также удалит том.

Вы можете увидеть все названные тома, запустив docker volume ls

Краткое примечание: docker-compose предназначен для разработки ине для производства.Возможно, вы захотите рассмотреть другую стратегию.

1 голос
/ 04 июня 2019
  1. Создать папку на хост-машине
mkdir /data/mysql
Запустите MySQL в Docker Скопируйте базу данных из запущенного контейнера MySQL на хост-машину
docker ps | grep mysql
docker cp <container_id>:/var/lib/mysql /data/mysql
Внесите изменения в ваш docker-compose.yml
    volumes:
      - ./db:/docker-entrypoint-initdb.d/:ro
      - /data/mysql:/var/lib/mysql
Перезапустить все.
0 голосов
/ 13 июня 2019

Во-первых, вам нужно иметь именованный том для сохранения данных, как упомянуто Крисом.

Затем создайте образ кода и запустите контейнер из нового образа по отдельности:

docker-compose up -d --no-deps --build app

Флаг --no-deps не запускает никаких связанных служб. Связанные сервисы запускаются по умолчанию. Это уничтожит ваши данные (например, когда вы сделали docker-compose up -d --build app).

Ссылки:

0 голосов
/ 06 июня 2019

Если вы просто хотите обновить контейнер app, не касаясь контейнера db, почему бы не сделать

docker-compose down app
docker-compose up app

В этом случае вы просто перестраиваете контейнер app, не касаясь контейнера db.

А также рекомендуется хранить ваши контейнеры без сохранения состояния.Храните данные MySQL на локальном компьютере, как подсказывает Qteb.

Спасибо.

...