【发布时间】:2019-06-03 20:34:41
【问题描述】:
我有一个 Python+MySQL 网络服务在生产中的 Digital Ocean 液滴上运行。当我在本地机器上更新项目中的代码时,我希望更改也发生在 droplet(生产中)中。所以我做了以下部署:
$ 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
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
【问题讨论】:
-
它实际上对您的数据库做了什么,您使用了诸如 kill 和 nuke 之类的模糊词?如果您正确定义了卷,那么它在备份时不应丢失任何数据
-
我不知道它对它做了什么。我只能说这些表不再存在(数据库确实存在,但它完全是空的)
-
我最好的猜测是它完全重新初始化了它。因此,它会用新的卷覆盖该卷。但这纯粹是猜测。
-
“你已经正确定义了卷,那么当它恢复时它不应该丢失任何数据” - 我如何正确定义卷?我已经发布了我所做的一切。
标签: mysql docker-compose devops