我有一个在生产中的Digital Ocean小滴上运行的Python + MySQL Web服务。当我在本地计算机上更新项目中的代码时,我也希望更改也发生在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
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
答案 0 :(得分:1)
mkdir /data/mysql
docker ps | grep mysql
docker cp <container_id>:/var/lib/mysql /data/mysql
volumes:
- ./db:/docker-entrypoint-initdb.d/:ro
- /data/mysql:/var/lib/mysql
答案 1 :(得分:1)
您必须像这样为数据库创建一个命名卷
version: '3'
services:
mysql:
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
现在,您可以运行Sa docker-compose stop
或docker-compose down
,而不会丢失mysql_data
卷上的数据。仅当您运行docker-compose down -v
时,它也会同时删除该卷。
您可以通过运行docker volume ls
快速说明:docker-compose是为开发而非生产而设计的。您可能需要考虑其他策略。
答案 2 :(得分:0)
如果您只想更新app
容器而不触摸db
容器,为什么不这样做
docker-compose down app
docker-compose up app
在这种情况下,您只是在不触摸app
容器的情况下重建db
容器。
并且还建议您使容器保持无状态。按照Qteb
的建议将mysql数据存储在本地计算机上。
谢谢。
答案 3 :(得分:0)
首先,您需要具有命名卷,以确保数据持久性,如Chris所述。
然后,构建代码映像并从新映像中分别启动容器:
docker-compose up -d --no-deps --build app
--no-deps
标志不会启动任何链接的服务。链接服务默认情况下启动。那会破坏您的数据(就像您做docker-compose up -d --build app
时一样)。
参考文献:
答案 4 :(得分:0)
要存储mysql数据库或其他数据库数据,请确保您的docker-compose.yml看起来像 1.如果要使用Dockerfile
function save_card(){
return __( 'Save my card.', 'dokan' );
}
add_filter('dokan_stripe_save_to_account_text','save_card');
2。如果要使用映像而不是Dockerfile,则docker-compose.yml看起来像
version: '3.1'
services:
php:
build:
context: .
dockerfile: Dockerfile
ports:
- 80:80
volumes:
- ./src:/var/www/html/
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- mysql-data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
volumes:
mysql-data:
如果要存储或保存mysql的数据,则 必须记住在docker-compose.yml中添加两行
version: '3.1'
services:
php:
image: php:7.4-apache
ports:
- 80:80
volumes:
- ./src:/var/www/html/
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- mysql-data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
volumes:
和
volumes:
- mysql-data:/var/lib/mysql
之后使用此命令
volumes:
mysql-data:
现在,您的数据将保持不变,即使使用此命令也不会被删除
docker-compose up -d
额外:-但如果要删除所有数据,则将使用
docker-compose down
另外,您可以使用此命令检查数据库数据列表
docker-compose down -v