stream浪者,泊坞窗,共享卷在初始configuration时还没有准备好

我玩docker和stream浪,以隔离我的开发环境在OS X上。 到目前为止,我已经find了一些很好的教程和介绍,但其中一些post似乎已过时,因为stream浪者参与…

我的主要问题是从我的主机到docker集装箱安装一个共享文件夹 – 这样的工作,但我不知道如果我遇到一个stream浪者/docker问题或只是做错了什么。

让我解释我目前的状态:

我正在为我的虚拟机使用以下Vagrantfile.boot2docker ,并将当前目录安装到vm中的/app 。 当我更新主机上的文件时,我可以看到虚拟机内的文件夹以及内容的变化。

 VAGRANTFILE_API_VERSION = "2" Vagrant.require_version ">= 1.6.3" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "yungsang/boot2docker" config.vm.network "private_network", ip: "192.168.33.10" config.vm.synced_folder ".", "/app", type: "rsync" # Uncomment below to use more than one instance at once # config.vm.network :forwarded_port, guest: 2375, host: 2375, auto_correct: true # Fix busybox/udhcpc issue config.vm.provision :shell do |s| s.inline = <<-EOT if ! grep -qs ^nameserver /etc/resolv.conf; then sudo /sbin/udhcpc fi cat /etc/resolv.conf EOT end # Adjust datetime after suspend and resume config.vm.provision :shell do |s| s.inline = <<-EOT sudo /usr/local/bin/ntpclient -s -h pool.ntp.org date EOT end config.vm.network :forwarded_port, guest: 5000, host: 5000 end 

在我的Vagrantfile我创build了两个独立的Vagrantfile容器,一个隔离的redis实例和我的节点应用程序,它将vm的应用程序目录安装到容器d.volumes=["/app:/foo"]

 VAGRANTFILE_API_VERSION = "2" ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker' Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.define "redis" do |redis| redis.vm.provider 'docker' do |d| d.image = 'redis:latest' #Comment the line below if you are running on a linux host d.vagrant_vagrantfile = "./Vagrantfile.boot2docker" d.name = 'redis' end end config.vm.define "node_app" do |node_app| node_app.vm.provider "docker" do |d| d.name = 'node_app' d.build_dir = "." #Comment the line below if you are running on a linux host d.vagrant_vagrantfile = "./Vagrantfile.boot2docker" d.ports = ["5000:5000"] d.volumes = ["/app:/foo"] d.link('redis:redis') end end end 

我的Dockerfile加载最新的nodejs容器,并将package.jsonapp.js从主机复制到app目录,然后再安装依赖项并运行应用程序。 从当前目录的文件夹的静态副本工作正常,我的应用程序连接到redis和工作,我可以达到预期在http://192.168.33.10:5000 ! (注意:我已经在这里注释了VOLUME命令,所以文件只是在lifecylce开头的容器上复制)

 FROM node:latest #use vagrant shared folder ADD . /app WORKDIR /app # install your application's dependencies RUN npm install # exposes our app port EXPOSE 5000 # replace this with your main "server" script file CMD ["node", "app.js"] 

我第一次成功后,试图使用我的共享卷,并更改了Dockerfile ,如下所示:

 FROM node:latest #use vagrant shared folder ADD . /foo # mount volume VOLUME ['/foo'] WORKDIR /foo # install your application's dependencies RUN npm install # exposes our app port EXPOSE 5000 # replace this with your main "server" script file CMD ["node", "app.js"] 

我已经重新加载虚拟机,并得到了一堆错误:大多no package.json foundnpm module missing (express) 。 我想通过使用第一个Dockerfile和下面的node.js应用程序https://gist.github.com/joernroeder/e86a3882360497c828f9 (它只是列出/foo中的文件和那里的内容) – 体积需要一些用它自己的初始内容replacefoo的内容,并删除生成的文件(包括node_modules目录)。 因此/foo的文件反映了来自主机的更改,并且同步工作正常。

你对我有什么提示和技巧吗?我可以怎样把音量调整到最小?还是我在这里做了一些完全愚蠢的事情?

谢谢

只有在执行dockerfile并启动容器后,才能为node_app容器d.volumes = ["/app:/foo"]定义的卷。

解决方法是首先在dockerfile中使用Add /app /foo ,在创build容器之后,静态添加的数据将被卷装入覆盖。

docker和compose的示例实现可以在这里find: https : //github.com/b00giZm/docker-compose-nodejs-examples/tree/master/02-express-redis-nodemon 。 请注意,如果不使用stream浪者和docker服务提供者,这也是可能的。