diff --git a/compose/rails.md b/compose/rails.md index 59e873a749..547ca7bda9 100644 --- a/compose/rails.md +++ b/compose/rails.md @@ -9,11 +9,12 @@ a Rails/PostgreSQL app. Before starting, [install Compose](install.md). ### Define the project -Start by setting up the files needed to build the app. App will run inside a Docker container containing its dependencies. Defining dependencies is done using a file called `Dockerfile`. To begin with, the + +Start by setting up the files needed to build the app. App will run inside a Docker container containing its dependencies. Defining dependencies is done using a file called `Dockerfile`. To begin with, the Dockerfile consists of: FROM ruby:2.5 - RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs + RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile @@ -21,6 +22,15 @@ Dockerfile consists of: RUN bundle install COPY . /myapp + # Add a script to be executed every time the container starts. + COPY entrypoint.sh /usr/bin/ + RUN chmod +x /usr/bin/entrypoint.sh + ENTRYPOINT ["entrypoint.sh"] + EXPOSE 3000 + + # Start the main process. + CMD ["rails", "server", "-b", "0.0.0.0"] + That'll put your application code inside an image that builds a container with Ruby, Bundler and all your dependencies inside it. For more information on how to write Dockerfiles, see the [Docker user @@ -37,6 +47,22 @@ Create an empty `Gemfile.lock` to build our `Dockerfile`. touch Gemfile.lock +Next, provide an entrypoint script to fix a Rails-specific issue that +prevents the server from restarting when a certain `server.pid` file pre-exists. +This script will be executed every time the container gets started. +`entrypoint.sh` consists of: + +```bash +#!/bin/bash +set -e + +# Remove a potentially pre-existing server.pid for Rails. +rm -f /myapp/tmp/pids/server.pid + +# Then exec the container's main process (what's set as CMD in the Dockerfile). +exec "$@" +``` + 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 @@ -51,7 +77,7 @@ to link them together and expose the web app's port. - ./tmp/db:/var/lib/postgresql/data web: build: . - command: bundle exec rails s -p 3000 -b '0.0.0.0' + command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp ports: @@ -61,7 +87,6 @@ to link them together and expose the web app's port. >**Tip**: You can use either a `.yml` or `.yaml` extension for this file. - ### Build the project With those files in place, you can now generate the Rails skeleton app @@ -77,27 +102,26 @@ List the files. ```bash $ ls -l -total 72 --rw-r--r-- 1 vmb staff 223 5 26 14:20 Dockerfile --rw-r--r-- 1 vmb staff 2223 5 26 14:24 Gemfile --rw-r--r-- 1 vmb staff 5300 5 26 14:25 Gemfile.lock --rw-r--r-- 1 vmb staff 374 5 26 14:24 README.md --rw-r--r-- 1 vmb staff 227 5 26 14:24 Rakefile -drwxr-xr-x 10 vmb staff 320 5 26 14:24 app -drwxr-xr-x 9 vmb staff 288 5 26 14:25 bin -drwxr-xr-x 16 vmb staff 512 5 26 14:24 config --rw-r--r-- 1 vmb staff 130 5 26 14:24 config.ru -drwxr-xr-x 3 vmb staff 96 5 26 14:24 db --rw-r--r-- 1 vmb staff 266 5 26 14:22 docker-compose.yml -drwxr-xr-x 4 vmb staff 128 5 26 14:24 lib -drwxr-xr-x 3 vmb staff 96 5 26 14:24 log --rw-r--r-- 1 vmb staff 63 5 26 14:24 package.json -drwxr-xr-x 9 vmb staff 288 5 26 14:24 public -drwxr-xr-x 3 vmb staff 96 5 26 14:24 storage -drwxr-xr-x 11 vmb staff 352 5 26 14:24 test -drwxr-xr-x 6 vmb staff 192 5 26 14:24 tmp -drwxr-xr-x 3 vmb staff 96 5 26 14:24 vendor - +total 64 +-rw-r--r-- 1 vmb staff 222 Jun 7 12:05 Dockerfile +-rw-r--r-- 1 vmb staff 1738 Jun 7 12:09 Gemfile +-rw-r--r-- 1 vmb staff 4297 Jun 7 12:09 Gemfile.lock +-rw-r--r-- 1 vmb staff 374 Jun 7 12:09 README.md +-rw-r--r-- 1 vmb staff 227 Jun 7 12:09 Rakefile +drwxr-xr-x 10 vmb staff 340 Jun 7 12:09 app +drwxr-xr-x 8 vmb staff 272 Jun 7 12:09 bin +drwxr-xr-x 14 vmb staff 476 Jun 7 12:09 config +-rw-r--r-- 1 vmb staff 130 Jun 7 12:09 config.ru +drwxr-xr-x 3 vmb staff 102 Jun 7 12:09 db +-rw-r--r-- 1 vmb staff 211 Jun 7 12:06 docker-compose.yml +-rw-r--r-- 1 vmb staff 184 Jun 7 12:08 entrypoint.sh +drwxr-xr-x 4 vmb staff 136 Jun 7 12:09 lib +drwxr-xr-x 3 vmb staff 102 Jun 7 12:09 log +-rw-r--r-- 1 vmb staff 63 Jun 7 12:09 package.json +drwxr-xr-x 9 vmb staff 306 Jun 7 12:09 public +drwxr-xr-x 9 vmb staff 306 Jun 7 12:09 test +drwxr-xr-x 4 vmb staff 136 Jun 7 12:09 tmp +drwxr-xr-x 3 vmb staff 102 Jun 7 12:09 vendor ``` If you are running Docker on Linux, the files `rails new` created are owned by @@ -150,27 +174,20 @@ You can now boot the app with [docker-compose up](/compose/reference/up/): docker-compose up -If all's well, you should see some PostgreSQL output, and then — after a few -seconds — the familiar refrain: +If all's well, you should see some PostgreSQL output. - Starting rails_db_1 ... - Starting rails_db_1 ... done - Recreating rails_web_1 ... - Recreating rails_web_1 ... done - Attaching to rails_db_1, rails_web_1 - db_1 | LOG: database system was shut down at 2017-06-07 19:12:02 UTC - db_1 | LOG: MultiXact member wraparound protections are now enabled - db_1 | LOG: database system is ready to accept connections - db_1 | LOG: autovacuum launcher started - web_1 | => Booting Puma - web_1 | => Rails 5.2.0 application starting in development - web_1 | => Run `rails server -h` for more startup options - web_1 | Puma starting in single mode... - web_1 | * Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song - web_1 | * Min threads: 5, max threads: 5 - web_1 | * Environment: development - web_1 | * Listening on tcp://0.0.0.0:3000 - web_1 | Use Ctrl-C to stop +```bash +rails_db_1 is up-to-date +Creating rails_web_1 ... done +Attaching to rails_db_1, rails_web_1 +db_1 | PostgreSQL init process complete; ready for start up. +db_1 | +db_1 | 2018-03-21 20:18:37.437 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 +db_1 | 2018-03-21 20:18:37.437 UTC [1] LOG: listening on IPv6 address "::", port 5432 +db_1 | 2018-03-21 20:18:37.443 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" +db_1 | 2018-03-21 20:18:37.726 UTC [55] LOG: database system was shut down at 2018-03-21 20:18:37 UTC +db_1 | 2018-03-21 20:18:37.772 UTC [1] LOG: database system is ready to accept connections +``` Finally, you need to create the database. In another terminal, run: diff --git a/config/containers/logging/gelf.md b/config/containers/logging/gelf.md index c5be667ae5..49aa4f0aab 100644 --- a/config/containers/logging/gelf.md +++ b/config/containers/logging/gelf.md @@ -46,7 +46,7 @@ and `--log-opt` options to the Docker daemon: ```bash dockerd - --log-driver gelf –-log-opt gelf-address=udp://1.2.3.4:12201 \ + --log-driver gelf --log-opt gelf-address=udp://1.2.3.4:12201 \ ``` To make the configuration permanent, you can configure it in `/etc/docker/daemon.json`: diff --git a/docker-for-mac/index.md b/docker-for-mac/index.md index bcba8d9fcf..de886d18a2 100644 --- a/docker-for-mac/index.md +++ b/docker-for-mac/index.md @@ -503,6 +503,21 @@ ln -s $etc/docker-machine.bash-completion $(brew --prefix)/etc/bash_completion.d ln -s $etc/docker-compose.bash-completion $(brew --prefix)/etc/bash_completion.d/docker-compose ``` +Add the following to your `~/.bash_profile`: + + +```shell +[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion +``` + +OR + +```shell +if [ -f $(brew --prefix)/etc/bash_completion ]; then +. $(brew --prefix)/etc/bash_completion +fi +``` + ### Zsh In Zsh, the [completion