|  | @@ -30,7 +30,9 @@ Dockerfile consists of:
 | 
	
		
			
				|  |  |      RUN bundle install
 | 
	
		
			
				|  |  |      ADD . /myapp
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -That'll put your application code inside an image that will build a container with Ruby, Bundler and all your dependencies inside it. For more information on how to write Dockerfiles, see the [Docker user guide](https://docs.docker.com/engine/userguide/dockerimages/#building-an-image-from-a-dockerfile) and the [Dockerfile reference](https://docs.docker.com/engine/reference/builder/).
 | 
	
		
			
				|  |  | +That'll put your application code inside an image that will build a container
 | 
	
		
			
				|  |  | +with Ruby, Bundler and all your dependencies inside it. For more information on
 | 
	
		
			
				|  |  | +how to write Dockerfiles, see the [Docker user guide](https://docs.docker.com/engine/userguide/dockerimages/#building-an-image-from-a-dockerfile) and the [Dockerfile reference](https://docs.docker.com/engine/reference/builder/).
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Next, create a bootstrap `Gemfile` which just loads Rails. It'll be overwritten in a moment by `rails new`.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -41,7 +43,11 @@ You'll need an empty `Gemfile.lock` in order to build our `Dockerfile`.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      $ touch Gemfile.lock
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Finally, `docker-compose.yml` is where the magic happens. This file describes the services that comprise your app (a database and a web app), how to get each one's Docker image (the database just runs on a pre-made PostgreSQL image, and the web app is built from the current directory), and the configuration needed to link them together and expose the web app's port.
 | 
	
		
			
				|  |  | +Finally, `docker-compose.yml` is where the magic happens. This file describes
 | 
	
		
			
				|  |  | +the services that comprise your app (a database and a web app), how to get each
 | 
	
		
			
				|  |  | +one's Docker image (the database just runs on a pre-made PostgreSQL image, and
 | 
	
		
			
				|  |  | +the web app is built from the current directory), and the configuration needed
 | 
	
		
			
				|  |  | +to link them together and expose the web app's port.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      db:
 | 
	
		
			
				|  |  |        image: postgres
 | 
	
	
		
			
				|  | @@ -62,22 +68,38 @@ using `docker-compose run`:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      $ docker-compose run web rails new . --force --database=postgresql --skip-bundle
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -First, Compose will build the image for the `web` service using the
 | 
	
		
			
				|  |  | -`Dockerfile`. Then it'll run `rails new` inside a new container, using that
 | 
	
		
			
				|  |  | -image. Once it's done, you should have generated a fresh app:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $ ls
 | 
	
		
			
				|  |  | -    Dockerfile   app          docker-compose.yml      tmp
 | 
	
		
			
				|  |  | -    Gemfile      bin          lib          vendor
 | 
	
		
			
				|  |  | -    Gemfile.lock config       log
 | 
	
		
			
				|  |  | -    README.rdoc  config.ru    public
 | 
	
		
			
				|  |  | -    Rakefile     db           test
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The files `rails new` created are owned by root. This happens because the
 | 
	
		
			
				|  |  | -container runs as the `root` user.  Change the ownership of the new files.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    sudo chown -R $USER:$USER .
 | 
	
		
			
				|  |  | +First, Compose will build the image for the `web` service using the `Dockerfile`. Then it'll run `rails new` inside a new container, using that image. Once it's done, you should have generated a fresh app:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      $ ls -l
 | 
	
		
			
				|  |  | +      total 56
 | 
	
		
			
				|  |  | +      -rw-r--r--   1 user  staff   215 Feb 13 23:33 Dockerfile
 | 
	
		
			
				|  |  | +      -rw-r--r--   1 user  staff  1480 Feb 13 23:43 Gemfile
 | 
	
		
			
				|  |  | +      -rw-r--r--   1 user  staff  2535 Feb 13 23:43 Gemfile.lock
 | 
	
		
			
				|  |  | +      -rw-r--r--   1 root  root   478 Feb 13 23:43 README.rdoc
 | 
	
		
			
				|  |  | +      -rw-r--r--   1 root  root   249 Feb 13 23:43 Rakefile
 | 
	
		
			
				|  |  | +      drwxr-xr-x   8 root  root   272 Feb 13 23:43 app
 | 
	
		
			
				|  |  | +      drwxr-xr-x   6 root  root   204 Feb 13 23:43 bin
 | 
	
		
			
				|  |  | +      drwxr-xr-x  11 root  root   374 Feb 13 23:43 config
 | 
	
		
			
				|  |  | +      -rw-r--r--   1 root  root   153 Feb 13 23:43 config.ru
 | 
	
		
			
				|  |  | +      drwxr-xr-x   3 root  root   102 Feb 13 23:43 db
 | 
	
		
			
				|  |  | +      -rw-r--r--   1 user  staff   161 Feb 13 23:35 docker-compose.yml
 | 
	
		
			
				|  |  | +      drwxr-xr-x   4 root  root   136 Feb 13 23:43 lib
 | 
	
		
			
				|  |  | +      drwxr-xr-x   3 root  root   102 Feb 13 23:43 log
 | 
	
		
			
				|  |  | +      drwxr-xr-x   7 root  root   238 Feb 13 23:43 public
 | 
	
		
			
				|  |  | +      drwxr-xr-x   9 root  root   306 Feb 13 23:43 test
 | 
	
		
			
				|  |  | +      drwxr-xr-x   3 root  root   102 Feb 13 23:43 tmp
 | 
	
		
			
				|  |  | +      drwxr-xr-x   3 root  root   102 Feb 13 23:43 vendor
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If you are running Docker on Linux, the files `rails new`  created are owned by
 | 
	
		
			
				|  |  | +root. This happens because the container runs as the root user. Change the
 | 
	
		
			
				|  |  | +ownership of the the new files.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      sudo chown -R $USER:$USER .
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If you are running Docker on Mac or Windows, you should already have ownership
 | 
	
		
			
				|  |  | +of all files, including those generated by `rails new`. List the files just to
 | 
	
		
			
				|  |  | +verify this.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Uncomment the line in your new `Gemfile` which loads `therubyracer`, so you've
 | 
	
		
			
				|  |  |  got a Javascript runtime:
 | 
	
	
		
			
				|  | @@ -130,6 +152,14 @@ Finally, you need to create the database. In another terminal, run:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  That's it. Your app should now be running on port 3000 on your Docker daemon. If you're using [Docker Machine](https://docs.docker.com/machine/), then `docker-machine ip MACHINE_VM` returns the Docker host IP address.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +>**Note**: If you stop the example application and attempt to restart it, you might get the
 | 
	
		
			
				|  |  | +following error: `web_1 | A server is already running. Check
 | 
	
		
			
				|  |  | +/myapp/tmp/pids/server.pid.` One way to resolve this is to delete the file
 | 
	
		
			
				|  |  | +`tmp/pids/server.pid`, and then re-start the application with `docker-compose
 | 
	
		
			
				|  |  | +up`.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ## More Compose documentation
 | 
	
		
			
				|  |  |  
 |