在Docker-Compose中从一个容器挂载卷到另一个容器

241次阅读
没有评论

问题描述

在使用Docker-Compose时,遇到了一个问题。他有两个容器,分别是nginxangular。其中,angular容器包含代码,并且会在有新版本时从注册表中自动拉取(使用watchtower)。用户在angularnginx之间设置了一个共享卷,以便将angular的代码共享给nginx使用。

问题出现在当有新版本的client代码时,angular容器被重新构建,新版本的代码被放入其中,但是在nginx容器中,仍然是旧版本的client代码。共享卷的机制不满足用户的需求,因为无法指定是哪个容器作为主机。用户希望知道是否有可能在一个容器中将卷挂载到另一个容器。

解决方案

以下解决方案中的操作可能需要根据你的实际情况进行微调,特别是在涉及到镜像和容器名称时。

方案1:调整构建以避免共享卷

你可以调整构建过程,将相关数据直接包含在各自的镜像中,从而避免使用共享卷。这样,在新版本的client代码被构建进angular镜像时,nginx容器也会随之更新,避免了版本不一致的问题。

方案2:使用脚本在容器启动时复制数据

如果无法避免使用共享卷,你可以编写脚本,在容器启动时将数据从一个容器复制到共享卷中,以确保数据同步。下面是一个示例脚本,用于在angular容器启动时将数据复制到共享卷中:

#!/bin/bash

# 启动angular容器
docker-compose up -d angular

# 等待angular容器启动完全
while ! docker-compose exec angular echo "Angular container is ready"; do
  sleep 1
done

# 复制数据到共享卷中
docker-compose exec angular cp -r /path/to/client /var/www/client

在上面的示例中,我们首先使用docker-compose up -d angular命令启动angular容器。然后,使用一个循环来等待angular容器完全启动(这里是通过在容器内运行echo命令来测试)。一旦angular容器就绪,我们再使用docker-compose exec命令将数据从容器复制到共享卷中。

请注意,以上只是示例脚本,你需要根据实际情况进行调整,确保路径和命令正确。

方案3:使用命名卷代替绑定卷

你可以考虑使用命名卷(named volumes)来替代绑定卷(bind mounts)。命名卷是Docker的一种卷管理机制,可以更好地满足容器间共享数据的需求。你可以通过以下步骤来使用命名卷:

  1. docker-compose.yml文件中定义命名卷:
version: '3'
services:
  angular:
    image: registry.gitlab.com/***/***:staging
    volumes:
      - client:/var/www/client
  nginx:
    image: registry.gitlab.com/***/***/***:staging
    volumes:
      - client:/var/www/client
    depends_on:
      - angular

volumes:
  client:
  1. 运行docker-compose up启动容器。

命名卷可以在容器之间共享数据,无需担心不同容器之间的启动顺序。

总结

在Docker-Compose中,你可以通过调整构建、使用脚本复制数据或者使用命名卷来实现从一个容器挂载卷到另一个容器的需求。根据你的具体情况,选择适合的方案来保持容器间数据的同步和一致性。

请注意,在实际操作中,你可能需要根据具体情况进行微调和优化,以确保解决方案的稳定性和可靠性。

注意:本文中的解决方案可能需要根据实际情况进行适当的调整和修改。

正文完