代码之家  ›  专栏  ›  技术社区  ›  Martin Thoma

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

  •  0
  • Martin Thoma  · 技术社区  · 5 年前

    我有一个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
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   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是为开发而设计的,不是为生产而设计的。你可能想考虑一个不同的策略。

        2
  •  1
  •   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. 重新启动所有。
        3
  •  0
  •   Himakar    5 年前

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

    docker-compose down app
    docker-compose up app
    

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

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

    谢谢。

        4
  •  0
  •   z11i AJcodez    5 年前

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

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

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

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

    参考文献: