Skip to content

Instantly share code, notes, and snippets.

@davidderus
Last active March 3, 2024 10:15
Show Gist options
  • Save davidderus/5845223ad87144c6c07ee48111d48496 to your computer and use it in GitHub Desktop.
Save davidderus/5845223ad87144c6c07ee48111d48496 to your computer and use it in GitHub Desktop.

Revisions

  1. davidderus revised this gist Oct 10, 2017. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion Dockerfile
    Original file line number Diff line number Diff line change
    @@ -17,7 +17,8 @@ RUN apk add --no-cache \
    tzdata \
    git \
    postgresql-dev \
    nodejs
    nodejs \
    imagemagick

    # Configuring main directory
    RUN mkdir -p $APP_PATH
  2. davidderus revised this gist Oct 6, 2017. 2 changed files with 52 additions and 23 deletions.
    17 changes: 12 additions & 5 deletions .dockerignore
    Original file line number Diff line number Diff line change
    @@ -1,11 +1,18 @@
    .git
    .gitignore
    doc
    /doc
    .yardoc
    coverage
    jsdoc
    tmp
    log
    /tmp
    /log
    Dockerfile
    Dockerfile.prod
    docker-compose.yml
    README.md
    public/uploads/
    spec
    /public/uploads
    /test/reports
    .env
    .envrc
    .byebug_history
    .rake_tasks
    58 changes: 40 additions & 18 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -1,21 +1,43 @@
    FROM ruby:2.3.1-slim

    RUN apt-get update && apt-get install -qq -y build-essential

    RUN apt-get install -y libpq-dev
    RUN apt-get install -y --fix-missing libxml2-dev libxslt1-dev
    RUN apt-get install -y nodejs

    ENV INSTALL_PATH /app
    ENV RAILS_ENV production
    ENV RACK_ENV production

    RUN mkdir $INSTALL_PATH

    WORKDIR $INSTALL_PATH
    # From one of the official ruby images
    FROM ruby:2.4.1-alpine

    # Available (and reused) args
    # Use --build-arg APP_PATH=/usr/app to use another app directory
    # Use --build-arg PORT=5000 to use another app default port
    ARG APP_PATH='/app'
    ARG PORT=3000

    # Setting env up
    ENV RAILS_ENV='production'
    ENV RAKE_ENV='production'

    # Installing required packages
    RUN apk add --no-cache \
    build-base \
    tzdata \
    git \
    postgresql-dev \
    nodejs

    # Configuring main directory
    RUN mkdir -p $APP_PATH
    WORKDIR $APP_PATH

    # Adding gems
    COPY Gemfile* ./
    RUN bundle install --jobs 20 --retry 5 --without development test

    COPY Gemfile* $INSTALL_PATH/
    # Adding project files
    COPY . ./
    RUN bundle exec rake DATABASE_URL=postgres:does_not_exist assets:precompile

    RUN bundle install --jobs 20 --retry 5 --without development test
    EXPOSE $PORT
    CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

    COPY . $INSTALL_PATH
    # Metadata
    LABEL org.label-schema.vendor="David Dérus" \
    org.label-schema.url="https://davidderus.com" \
    org.label-schema.name="RailsApp" \
    org.label-schema.description="A Rails production server using Puma and precompiling assets" \
    org.label-schema.version="v1.1.0" \
    org.label-schema.docker.schema-version="1.0"
  3. davidderus created this gist Jul 8, 2016.
    11 changes: 11 additions & 0 deletions .dockerignore
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    .git
    .gitignore
    doc
    .yardoc
    coverage
    jsdoc
    tmp
    log
    README.md
    public/uploads/
    spec
    21 changes: 21 additions & 0 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    FROM ruby:2.3.1-slim

    RUN apt-get update && apt-get install -qq -y build-essential

    RUN apt-get install -y libpq-dev
    RUN apt-get install -y --fix-missing libxml2-dev libxslt1-dev
    RUN apt-get install -y nodejs

    ENV INSTALL_PATH /app
    ENV RAILS_ENV production
    ENV RACK_ENV production

    RUN mkdir $INSTALL_PATH

    WORKDIR $INSTALL_PATH

    COPY Gemfile* $INSTALL_PATH/

    RUN bundle install --jobs 20 --retry 5 --without development test

    COPY . $INSTALL_PATH
    26 changes: 26 additions & 0 deletions docker-compose.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,26 @@
    app:
    env_file: .env
    build: .
    entrypoint: bundle exec
    command: rails server -p 3000
    volumes:
    - .:/app
    ports:
    - "3000"
    links:
    - postgres
    postgres:
    env_file: .env
    image: postgres:9.4
    ports:
    - "5432"
    nginx:
    image: nginx
    links:
    - app
    volumes_from:
    - app
    volumes:
    - ./nginx.conf:/etc/nginx/conf.d/my_app.conf:ro
    ports:
    - "80:80"
    58 changes: 58 additions & 0 deletions nginx.conf
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    # From http://chrisstump.online/2016/02/20/docker-existing-rails-application/

    upstream puma {
    server app:3000;
    }

    server {
    # define your domain
    server_name my_app.com;

    # define the public application root
    root /app/public;
    index index.html;

    # define where Nginx should write its logs
    access_log /app/log/nginx.access.log;
    error_log /app/log/nginx.error.log;

    # deny requests for files that should never be accessed
    location ~ /\. {
    deny all;
    }

    location ~* ^.+\.(rb|log)$ {
    deny all;
    }

    # serve static (compiled) assets directly if they exist (for rails production)
    location ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ {
    try_files $uri @rails;

    access_log off;
    gzip_static on; # to serve pre-gzipped version

    expires max;
    add_header Cache-Control public;

    # Some browsers still send conditional-GET requests if there's a
    # Last-Modified header or an ETag header even if they haven't
    # reached the expiry date sent in the Expires header.
    add_header Last-Modified "";
    add_header ETag "";
    break;
    }

    # send non-static file requests to the app server
    location / {
    try_files $uri @rails;
    }

    location @rails {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://puma;
    }
    }