Py学习  »  docker

我怎样才能保留我的数据库,但在docker compose中更改代码?

Martin Thoma • 5 年前 • 1274 次点击  

我有一个python+mysql的webservice,运行在一个生产中的数字海洋水滴上。当我在本地机器上更新项目中的代码时,我希望这些更改也发生在水滴(生产中)中。因此,我执行以下操作来部署:

$ 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

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

文档文件

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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/41136
 
1274 次点击  
文章 [ 4 ]  |  最新文章 5 年前
z11i
Reply   •   1 楼
z11i    5 年前

首先,你需要 命名卷 对于chris提到的数据持久性。

然后,构建代码映像并分别从新映像启动容器:

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

这个 --no-deps 标志不启动任何链接服务。默认情况下会启动链接服务。会破坏你的数据 docker-compose up -d --build app )。

参考文献:

Himakar
Reply   •   2 楼
Himakar    5 年前

如果你只是想更新 app 不接触容器 db 集装箱为什么不

docker-compose down app
docker-compose up app

在这种情况下,你只是在重建你的 应用程序 不接触容器 分贝 容器。

同时建议保持容器无状态。将mysql数据作为 Qteb 建议。

谢谢。

Qteb
Reply   •   3 楼
Qteb    5 年前
  1. 在主机上创建文件夹
mkdir /data/mysql
  1. 在Docker中启动MySQL
  2. 将数据库从运行mysql容器复制到主机
docker ps | grep mysql
docker cp <container_id>:/var/lib/mysql /data/mysql
  1. 在docker-compose.yml中进行更改
    volumes:
      - ./db:/docker-entrypoint-initdb.d/:ro
      - /data/mysql:/var/lib/mysql
  1. 重新启动所有。
Chris
Reply   •   4 楼
Chris    5 年前

必须为数据库创建一个命名卷,如下所示

version: '3'

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

volumes:
  mysql_data:

现在你可以安全地跑了 docker-compose stop docker-compose down 不会丢失你的数据 mysql_data 体积。只有当你跑的时候 docker-compose down -v 它也将删除卷。

通过运行 docker volume ls

简要说明:Docker Compose是为开发而设计的,不是为生产而设计的。你可能想考虑一个不同的策略。