Vagrant docker 提供商构建缓慢
Vagrant docker provider slow build
我正在尝试在 windows 机器上将 Vagrant 与 docker 提供程序一起使用。
我有这样的 Vagrantfile:
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define "app" do |app|
app.vm.provider "docker" do |d|
d.name = "app"
d.build_dir = "."
d.vagrant_machine = "dockerhost"
d.vagrant_vagrantfile = "./DockerhostVagrantfile"
end
end
end
Docker 主机定义如下:
Vagrant.configure("2") do |config|
config.vm.synced_folder ".", "/vagrant", type: "smb"
config.vm.provision "docker"
config.vm.define "dockerhost"
config.vm.box = "ubuntu/trusty64"
config.vm.network "forwarded_port",
guest: 8080, host: 8080
config.vm.provider :virtualbox do |vb|
vb.name = "dockerhost"
end
end
和Docker这样的容器:
FROM ubuntu:14.04
WORKDIR /vagrant/application
# .... install stuff
EXPOSE 8080
CMD ["/bin/bash"]
问题是每当我执行 vagrant docker-run app -- bash
和 docker 图像时都必须重建该过程需要很长时间。
// ....
app: Sending build context to Docker daemon 180.5 MB
app: Sending build context to Docker daemon 181 MB
app: Sending build context to Docker daemon 181.6 MB
// ....
我认为这是因为 dockerhost
中的文件夹是用 vboxfs
挂载的(我发现它非常慢)。
有什么方法可以强制 Vagrant 使用 smb
?
性能问题是否由其他原因引起?
最后我找到了一个解决方案,如何使用 smb
而不是 vboxfs
来挂载 docker build directory
。
如此处所述https://github.com/mitchellh/vagrant/commit/745bdf676675e7b1f25fd7df5a4ed48b582b6dc7
可以定义host_vm_build_dir_options
属性。所以我像这样修改了我的 Vagrantfile
:
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define "app" do |app|
app.vm.provider "docker" do |d|
d.name = "app"
d.build_dir = "."
d.vagrant_machine = "dockerhost"
d.vagrant_vagrantfile = "./DockerhostVagrantfile"
d.host_vm_build_dir_options = {
type: "smb"
}
end
end
end
无论如何,真正的速度问题 是由于 Dockerfile
在我的项目根目录中造成的,所以所有文件都被发送到主机。我通过将它移动到 Docker 文件夹解决了这个问题,其中只有 Docker 文件。
我正在尝试在 windows 机器上将 Vagrant 与 docker 提供程序一起使用。 我有这样的 Vagrantfile:
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define "app" do |app|
app.vm.provider "docker" do |d|
d.name = "app"
d.build_dir = "."
d.vagrant_machine = "dockerhost"
d.vagrant_vagrantfile = "./DockerhostVagrantfile"
end
end
end
Docker 主机定义如下:
Vagrant.configure("2") do |config|
config.vm.synced_folder ".", "/vagrant", type: "smb"
config.vm.provision "docker"
config.vm.define "dockerhost"
config.vm.box = "ubuntu/trusty64"
config.vm.network "forwarded_port",
guest: 8080, host: 8080
config.vm.provider :virtualbox do |vb|
vb.name = "dockerhost"
end
end
和Docker这样的容器:
FROM ubuntu:14.04
WORKDIR /vagrant/application
# .... install stuff
EXPOSE 8080
CMD ["/bin/bash"]
问题是每当我执行 vagrant docker-run app -- bash
和 docker 图像时都必须重建该过程需要很长时间。
// ....
app: Sending build context to Docker daemon 180.5 MB
app: Sending build context to Docker daemon 181 MB
app: Sending build context to Docker daemon 181.6 MB
// ....
我认为这是因为 dockerhost
中的文件夹是用 vboxfs
挂载的(我发现它非常慢)。
有什么方法可以强制 Vagrant 使用 smb
?
性能问题是否由其他原因引起?
最后我找到了一个解决方案,如何使用 smb
而不是 vboxfs
来挂载 docker build directory
。
如此处所述https://github.com/mitchellh/vagrant/commit/745bdf676675e7b1f25fd7df5a4ed48b582b6dc7
可以定义host_vm_build_dir_options
属性。所以我像这样修改了我的 Vagrantfile
:
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define "app" do |app|
app.vm.provider "docker" do |d|
d.name = "app"
d.build_dir = "."
d.vagrant_machine = "dockerhost"
d.vagrant_vagrantfile = "./DockerhostVagrantfile"
d.host_vm_build_dir_options = {
type: "smb"
}
end
end
end
无论如何,真正的速度问题 是由于 Dockerfile
在我的项目根目录中造成的,所以所有文件都被发送到主机。我通过将它移动到 Docker 文件夹解决了这个问题,其中只有 Docker 文件。