我有一个命名卷容器,可以将群集中的工作节点的共享资源部署到生产版本中。它似乎部署,但不会填充指定的卷。
此容器的图像如下所示:
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创建主机目录,并将容器的node_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部署时,我获得了图像和卷,我可以将它安装在另一个容器中,但是卷的内容丢失了。当我手动运行相同的图像时,卷的内容都是正确的。
任何线索/见解都非常感谢。谢谢!