如何保留我的数据库,但更改 docker-compose 中的代码?

Mar*_*oma 4 mysql docker-compose devops

我有一个 Python+MySQL webservice 在生产中的 Digital Ocean 液滴上运行。当我在本地机器上更新项目中的代码时,我希望更改也发生在 Droplet(生产中)中。因此,我执行以下操作进行部署:

$ ssh root@12.34.56.78
# cd project
# git pull
# docker-compose down
# docker-compose build
# docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

在此之后,我的数据库是空的。它里面没有我的桌子。如何更新正在运行的代码但不丢失数据?

我的代码

项目结构

.
??? 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
Run Code Online (Sandbox Code Playgroud)

docker-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
Run Code Online (Sandbox Code Playgroud)

文件

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"]
Run Code Online (Sandbox Code Playgroud)

我试过的

# 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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 7

您必须像这样为数据库创建一个命名卷

version: '3'

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

volumes:
  mysql_data:
Run Code Online (Sandbox Code Playgroud)

现在您可以安全地运行docker-compose stopdocker-compose down不丢失mysql_data卷上的数据。只有当您运行docker-compose down -v它时,它才会删除卷。

您可以通过运行来查看所有命名的卷 docker volume ls

快速说明:docker-compose 是为开发而设计的,而不是为生产而设计的。您可能需要考虑不同的策略。