On a resent project at work we build a cross-platform chat-application with Xamarin and SignalR.
The SignalR-hub was to find it's home on a Linux-server, given ASP.NETs new found love for other platforms than Windows and IIS.
We had limited time and the back-end guys were developing the hub in Visual Studio. To help them make sure the code they wrote would be Mono-compatible (and easy to deploy for testing), I turned to my two favorite pieces of open source technology: Vagrant and Docker.
First, I wrote a simple Dockerfile based on the latest Mono-baseimage that adds the code and runs xbuild in the build-process. When the container is run without parameters, it deploys the server.
FROM mono:latest ADD SignalRServer SignalRServer RUN xbuild /SignalRServer/SignalRServer.sln EXPOSE 8080 CMD mono /SignalRServer/SignalRServer.LocalWebServer/bin/Debug/SignalRServer.LocalWebServer.exe
To automate this process, a simple script...
# /bin/bash sudo docker build -t dirc/signalrhub /vagrant/ sudo docker run -p 8080:8080 -td dirc/signalrhub
...before we finally spin up a VM via this Vagrantfile and
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant::Config.run do |config| config.vm.box = "virtualUbuntu64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.provision :shell, :inline => "sudo apt-get update" config.vm.provision :shell, :inline => "sudo apt-get install curl -y" config.vm.provision :shell, :inline => "curl -s https://get.docker.io/ubuntu/ | sudo sh > /dev/null 2>&1" config.vm.provision :shell, :inline => "/vagrant/buildAndDeploySignalRHub" config.vm.forward_port 8080, 8080 end Vagrant.configure("2") do |config| config.vm.provider :virtualbox do |virtualbox| virtualbox.customize ["modifyvm", :id, "--memory", "1024"] end end
Thats it! With a simple
vagrant up we get an Ubuntu VM, Docker installed, the code compiled and the hub deployed, and is available at
When the Hub is finished the Docker-container can easily be moved to the production server. If the Windows-guys uses code that breaks the Mono-compability, it is easily discovered.