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

时间:2019-06-03 20:34:41

标签: mysql docker-compose devops

我有一个在生产中的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

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

5 个答案:

答案 0 :(得分:1)

  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. 重新启动所有。

答案 1 :(得分:1)

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

version: '3'

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

volumes:
  mysql_data:

现在,您可以运行Sa docker-compose stopdocker-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