码头堆栈不会填充指定的卷

我有一个命名卷容器将共享资源部署到生产版本的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根据这个脚本在每个worker节点上创建一个命名卷。 创建一个命名卷意味着它在/ 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] 

我得到不同的结果: 码头卷ls显示一个新的卷创建。 检查显示类似的安装路径,这也不存在。 但是,当我如上所述在一个辅助容器中安装该命名卷时,我将该卷挂载到指定的挂载点,现在它包含我正在查找的大节点模块列表。

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

任何线索/见解大大赞赏。 谢谢!

Interesting Posts