【问题标题】:Docker Compose: Avoid recreation of data containerDocker Compose:避免重新创建数据容器
【发布时间】:2016-04-30 17:50:46
【问题描述】:

为了更新一些图像,我使用了“docker-compose pull”。 然后我构建:'docker-compose build'。

我只想更新应用程序容器,所以我删除了 它并重新启动: 'docker-compose rm app' 和 'docker-compose up -d app'。

但是发生了一些不想要的事情。数据容器也被重新创建。 旧数据丢失。

数据容器的 Dockerfile:

FROM gitlab/gitlab-ce:latest
VOLUME ["/etc/gitlab", "/var/log/gitlab", "/var/opt/gitlab"]
ENTRYPOINT ["hostname"]

docker-compose.yml:

version: '2'
services:
 gitlab:
  image: 'gitlab/gitlab-ce:latest'
  domainname: example.com
  hostname: gitlab
  networks:
   - devenv
  restart: always
  environment:
   GITLAB_OMNIBUS_CONFIG: |
    external_url 'http://gitlab.example.com'
    gitlab_rails['gitlab_shell_ssh_port'] = 2224
  ports:
   - '80:80'
   - '2224:22'
  volumes_from:
   - gitlabdata

 gitlabdata:
  build: gitlab-data

下次如何避免这种情况?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    docker-compose up 命令具有--no-recreate 标志。 如果容器已经存在,此标志避免重新创建容器。

    因此你可以运行

    docker-compose up -d --no-recreate app
    

    【讨论】:

      【解决方案2】:

      您的问题是因为您为容器创建了一个卷,然后删除了该容器,这也删除了您的卷。

      您应该更改您的卷,以便它们将挂载绑定到主机目录,这样您的文件就会存储在主机上,并且您可以重新附加到这些目录以防容器消失。另一个好处是能够从主机访问这些文件。

      这是您的撰写文件在新卷配置下的大致样子。

      version: '2'
      services:
         gitlab:
            image: 'gitlab/gitlab-ce:latest'
            domainname: example.com
            hostname: gitlab
            networks:
               - devenv
            restart: always
            environment:
               GITLAB_OMNIBUS_CONFIG: |
               external_url 'http://gitlab.example.com'
               gitlab_rails['gitlab_shell_ssh_port'] = 2224
            ports:
                - '80:80'
                - '2224:22'
            volumes_from:
                - gitlabdata
      
        gitlabdata:
            build: gitlab-data
            Volumes:
                - /etc/gitlab:/dir/on/host
                - /var/log/gitlab:/dir/on/host2
                - /var/opt/gitlab:/dir/on/host3
      

      你可以在主机上挂载任何你想要的东西。更多关于卷的信息:https://docs.docker.com/engine/userguide/containers/dockervolumes/#mount-a-host-directory-as-a-data-volume

      【讨论】:

      • 我认为除非您将 -v 传递给 docker-compose rm,否则不会删除卷?
      • 正确,我不确定他们是否通过了 -v,因为他们没有在问题中说,但由于卷已被删除,我认为这是他们所做的,但我不应该假设,所以感谢您抓住这一点。
      【解决方案3】:

      我遇到了一个问题,在我的情况下,我总是重新启动 docker-compose 服务,重新创建容器:

      我的/docker-compose-app.service

      [Unit]
      Description=Docker Compose Application Service
      Requires=docker.service
      After=docker.service
      
      [Service]
      Type=oneshot
      RemainAfterExit=yes
      WorkingDirectory=/srv/dockercnf
      ExecStart=/usr/local/bin/docker-compose up --no-recreate -d
      ExecStop=/usr/local/bin/docker-compose down
      TimeoutStartSec=0
      
      [Install]
      WantedBy=multi-user.target
      

      docker-compose.yml

      version: '2'
      services:
        mysql2:
          image: mysql/mysql-server:8.0
          container_name: mysql2-container
          networks:
            static-network:
              ipv4_address: 172.18.1.2
        mysql57:
          image: mysql/mysql-server:5.7
          container_name: mysql57-container
          networks:
            static-network:
              ipv4_address: 172.18.1.3
      networks:
        static-network:
          ipam:
            config:
              - subnet: 172.18.0.0/16
                #docker-compose v3+ do not use ip_range
                ip_range: 172.18.1.0/24
      

      我不知道自己错过了什么或做错了什么。

      已编辑 - 已解决

      在阅读StackOverFlow Thread 并得出自己的结论后,我编辑了我的 docker-compose.yml 文件如下:

      version: '2'
      services:
        mysql2:
          image: mysql/mysql-server:8.0
          container_name: mysql2-container
          networks:
            static-network:
              ipv4_address: 172.18.1.2
        mysql57:
          image: mysql/mysql-server:5.7
          container_name: mysql57-container
          restart: always
          volumes:
              - /srv/mysql57-container:/var/lib/mysql
          networks:
            static-network:
              ipv4_address: 172.18.1.3
      
      networks:
        static-network:
          ipam:
            config:
              - subnet: 172.18.0.0/16
                #docker-compose v3+ do not use ip_range
                ip_range: 172.18.1.0/24
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多