社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

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

Martin Thoma • 5 年前 • 1668 次点击  

我有一个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
 
1668 次点击  
文章 [ 4 ]  |  最新文章 5 年前
z11i
Reply   •   1 楼
z11i    6 年前

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

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

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

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

参考文献:

Himakar
Reply   •   2 楼
Himakar    6 年前

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

docker-compose down app
docker-compose up app

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

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

谢谢。

Qteb
Reply   •   3 楼
Qteb    6 年前
  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    6 年前

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

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是为开发而设计的,不是为生产而设计的。你可能想考虑一个不同的策略。