我有一个Meteor App部署在Ubuntu上,我需要从这个App中读取一个位于主机服务器上App容器之外的文件。
我如何才能做到这一点?
我已经尝试在mup.js中设置卷,但没有成功。似乎我错过了如何正确地提供 "卷"。/host/path
和 /container/path
volumes: {
// passed as '-v /host/path:/container/path' to the docker run command
'/host/path': '/container/path',
'/second/host/path': '/second/container/path'
},
看了Docker挂载卷的文档,但显然不能理解。
比方说,文件是在 /home/dirname/filename.csv
.
如何正确地将它挂载到App中,以便能够从App中访问它?
或者也许有其他的可能性来访问它?
欢迎来到Stack Overflow。让我提出另一种思考方式......。
在一个可扩展的集群中,docker实例可以随着应用程序的负载变化而上下转动。这些实例可能在同一台主机上,也可能不在同一台主机上,所以在主机的文件系统上建立依赖关系并不是一个好主意。
你可能会更好地考虑使用S3等文件存储机制,它将自行扩展,磁盘存储限制将不适用。
另一个选择是确定是否可以将文件存储在数据库中。
希望能帮到你
让我们试着缩小问题的范围。
Meteor UP传递的配置参数是 volumes
在你的评论中也提到了,他们直接把它放在docker上。因此,直接针对docker进行测试可能更容易--尽可能缩小涉及的组件范围。
sudo docker run \
-it \
--rm \
-v "/host/path:/container/path" \
-v "/second/host/path:/second/container/path" \
busybox \
/bin/sh
让我来解释一下。
sudo
因为Meteor UP使用sudo来启动容器。请看 https:/github.comzodernmeteor-upblob3c7120a75c12ea12fdd5688e33574c12e158fd07srcpluginsmeteorassetstemplatesstart.sh#L63。docker run
我们要启动一个容器。-it
访问容器(就像SSH'ing进入容器一样)。--rm
在我们完成后自动清理--移除容器。-v
- 在这里,我们给出你所定义的卷(我这里采用了你提供的两个目录的例子)。busybox
- 一个带有一些有用工具的图像。/bin/sh
- 用来启动容器的应用程序我希望你也不能访问这里的文件。在这种情况下,深挖一下为什么你不能在Docker中访问一个文件夹。
如果你可以,这在我听来很奇怪,你可以启动容器,并尝试通过运行以下命令进入容器。
docker exec -it my-mup-container /bin/sh
你可以认为这个命令就像SSH'ing进入一个正在运行的容器。现在你可以检查一下它是否真的不在那里,容器里面的凭证是否正确等等。
最后,我不得不同意 @mikkel 的观点,即挂载一个本地的 Directoy 并不是一个好的选择,但你现在可以开始研究如何使用这个命令了。docker volume
来挂载一个远程目录。他提到 S3
由AWS,我曾与 AzureFiles
在Azure上,有很多可能性。