|
|
@@ -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
|
|
|
|