2015-06-08 17 views
1

我在docker和vagrant中玩弄隔離我的開發環境。到目前爲止這麼好,我找到了一些很好的教程和介紹,但一些帖子似乎已過時作爲流浪漢envolved ...流浪漢,碼頭工人,共享卷在初始配置時沒有準備好

我的主要問題從我的主機上安裝共享文件夾到碼頭集裝箱 - 這種工作,但我不知道如果我遇到了流浪漢/碼頭問題或只是做錯了什麼。

讓我解釋一下我目前的狀態:

我使用以下Vagrantfile.boot2docker我的虛擬機和虛擬機安裝當前目錄/app。無論何時我更新主機上的文件,我都能看到vm內的文件夾,並且它的內容發生了變化。

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我創建兩個單獨泊塢窗的容器,一個孤立的Redis實例和我的節點的應用程序,其安裝在虛擬機中的應用程序目錄容器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中的文件以及其中的內容) - 卷需要一些時間才能裝入,用它自己的初始值替換foo的內容內容並刪除生成的文件(包括node_modules目錄)。 因此,/foo中的文件反映了主機的變化,並且同步運行良好。

你對我有什麼提示和技巧嗎?我可以如何在時間安裝音量,或者我在這裏做的事情完全是愚蠢的?

由於

+0

我建議你看看碼頭 - 碼頭和碼頭機。他們會解決你的問題。 – david30xie

+0

謝謝!使用docker-compose構建docker-machine的設置解決了我的問題! –

回答

1

的限定體積爲node_app容器d.volumes = ["/app:/foo"]僅執行後dockerfile和容器開始將可用。

解決方法是首先在dockerfile中使用Add /app /foo,創建容器後靜態添加的數據將被卷裝入重寫。

有docker和compose的示例實現可以在這裏找到:https://github.com/b00giZm/docker-compose-nodejs-examples/tree/master/02-express-redis-nodemon。請注意,如果不使用流浪者和碼頭服務提供者,這也是可能的。