Docker Compose:避免数据容器的重新创建

3

为了更新一些图片,我使用了“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

我该如何避免这种情况再次发生?
3个回答

5
docker-compose up --no-recreate

to start the containers without recreating them if they already exist.

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

0

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

你应该更改你的卷,使它们绑定挂载到主机目录,这样你的文件将存储在主机上,并且如果容器消失,你可以重新连接到那些目录。另一个好处是能够从主机访问这些文件。

以下是带有新卷配置的 compose 文件大致的样子。

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


我认为只有在使用docker-compose rm -v命令时才会删除卷? - johnharris85
没错,我不确定他们是否传递了“-v”,因为在问题中他们没有说明,但是由于卷已被删除,我假设他们这样做了,但我不应该假设,所以感谢你指出。 - Ken Cochrane

0
我在这方面遇到了问题,每次重新启动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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接