Docker堆栈不会填充命名卷

时间:2017-07-24 20:31:34

标签: docker docker-compose docker-swarm

我有一个命名卷容器,可以将群集中的工作节点的共享资源部署到生产版本中。它似乎部署,但不会填充指定的卷。

此容器的图像如下所示:

FROM alpine
RUN mkdir $HOME/node_modules
COPY ./node_modules $HOME/node_modules
VOLUME $HOME/node_modules

构建时,映像会将当前模块集从开发计算机复制到容器中的层中。然后,此容器作为服务部署在工作节点上,在撰写文件中定义为:

      version: "3"
      services:
        nmod_core:
          image: nmod_core:1.0.0
          environment:
            - HOME=/root
          volumes:
            - nmod_core:$HOME/node_modules
          deploy:
            replicas: 2
            placement:
              constraints: [node.role == worker] 
            restart_policy:
              condition: on-failure
              max_attempts: 1

在部署时,docker会根据此脚本在每个工作节点上创建一个命名卷。创建命名卷意味着它在/ var / lib / docker / volumes / nmod_core / _data创建主机目录,并将容器的nod​​e_modules内容复制到该目录中。

容器退出,因为它没有正在进行的过程。所以我将重启限制设置为1,以便服务不会继续尝试重新启动它。数据仍然存在于主机目录中,因为它是一个命名卷 - 这是目标 - 同一节点上的其他容器应该能够挂载它。

使用我的私人注册表设置的凭据,我通过以下方式部署堆栈:

docker stack deploy -c docker-compose.yml myapp --with-registry-auth

我看着服务被创建了。当我登录工作节点 docker image ls 时,显示已从注册表中提取了正确的图像。据推测,这些容器确实已经运行,因为 docker volume ls 显示已在每个节点上创建了命名卷,称为myapp_nmod_core。我可以 检查 这些卷,并将挂载位置报告为/ var / lib / docker / volumes / myapp_nmod_core / _data。但是,节点上不存在此位置。

尽管如此,我可以通过以下命令将此命名卷安装到容器中:

docker run -v myapp_nmod_core:/nmod -it alpine
#/ ls /nmod
#/

但是,如上所示,音量为空。

但是如果我在节点上手动运行容器:

docker run -it f2f55823173d
#/ ls /root/node_modules
   [a big list of node modules]

我得到了不同的结果: docker volume ls 显示已创建的新卷。 Inspect显示类似的挂载路径,也不存在。但是,当我将上述命名卷挂载到辅助容器中时,我将卷安装到指定的挂载点,它现在包含我正在寻找的大型节点模块列表。

因此,当通过docker swarm部署时,我获得了图像和卷,我可以将它安装在另一个容器中,但是卷的内容丢失了。当我手动运行相同的图像时,卷的内容都是正确的。

任何线索/见解都非常感谢。谢谢!

0 个答案:

没有答案