Skip to content

Instantly share code, notes, and snippets.

@erdostom
Last active November 25, 2022 14:53
Show Gist options
  • Save erdostom/5dd400cbba17d44b52b2f74b038fcb85 to your computer and use it in GitHub Desktop.
Save erdostom/5dd400cbba17d44b52b2f74b038fcb85 to your computer and use it in GitHub Desktop.
Good starter Dockerfile + docker-compose.yml for Rails 6.
  1. docker-compose build app
  2. docker-compose up

docker-compose run --rm app bundle # Gemfile change

docker compose exec app rake db:create

Thanks to @jfahrer for the Railsconf talk that taught me this

version: '3.7'
services:
app:
image: your_user_name_here/appname:v1
build:
context: .
command: ["spring", "server"]
environment:
- POSTGRES_HOST=pg
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=secret
- RAILS_ENV
volumes:
- ./:/usr/src/app
- gems:/usr/local/bundle
- node-modules:/usr/src/app/node_modules
- ${HOME}/.irbrc:/root/.irbrc
- ${HOME}/.irb-history:/root/.irb-history
web:
image: your_user_name_here/appname:v1
command: ["rails", "server", "-b", "0.0.0.0"]
environment:
- POSTGRES_HOST=pg
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=secret
- RAILS_ENV
volumes:
- ./:/usr/src/app
- gems:/usr/local/bundle
- node-modules:/usr/src/app/node_modules
ports:
- 3000:3000
pg:
image: postgres:11.2-alpine
volumes:
- pg-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=secret
webpacker:
image: your_user_name_here/appname:v1
command: ./bin/webpack-dev-server
volumes:
- ./:/usr/src/app
- gems:/usr/local/bundle
- node-modules:/usr/src/app/node_modules
ports:
- 3035:3035
volumes:
gems:
pg-data:
node-modules:
FROM ruby:2.6.5-alpine
RUN apk add --update --no-cache bash build-base nodejs sqlite-dev tzdata postgresql-dev yarn
RUN gem install bundler:2.1.4
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn install --check-files
COPY Gemfile* ./
RUN bundle install
COPY . .
ENV PATH=./bin:$PATH
CMD ["rails", "console"]
# config/webpacker.yml
# Note: You must restart bin/webpack-dev-server for changes to take effect
default: &default
source_path: app/javascript
source_entry_path: packs
public_root_path: public
public_output_path: packs
cache_path: tmp/cache/webpacker
check_yarn_integrity: false
webpack_compile_output: false
# Additional paths webpack should lookup modules
# ['app/assets', 'engine/foo/app/assets']
resolved_paths: []
# Reload manifest.json on all requests so we reload latest compiled packs
cache_manifest: false
# Extract and emit a css file
extract_css: false
static_assets_extensions:
- .jpg
- .jpeg
- .png
- .gif
- .tiff
- .ico
- .svg
- .eot
- .otf
- .ttf
- .woff
- .woff2
extensions:
- .mjs
- .js
- .sass
- .scss
- .css
- .module.sass
- .module.scss
- .module.css
- .png
- .svg
- .gif
- .jpeg
- .jpg
development:
<<: *default
compile: true
# Verifies that versions and hashed value of the package contents in the project's package.json
# check_yarn_integrity: true
# Reference: https://webpack.js.org/configuration/dev-server/
dev_server:
https: false
host: webpacker
port: 3035
public: localhost:3035
hmr: true
# Inline should be set to true if using HMR
inline: true
overlay: true
compress: true
disable_host_check: true
use_local_ip: false
quiet: false
headers:
'Access-Control-Allow-Origin': '*'
watch_options:
ignored: '**/node_modules/**'
test:
<<: *default
compile: true
# Compile test packs to a separate directory
public_output_path: packs-test
production:
<<: *default
# Production depends on precompilation of packs prior to booting for performance.
compile: false
# Extract and emit a css file
extract_css: true
# Cache manifest.json for performance
cache_manifest: true
@Air-Craft
Copy link

I think having RUN bundle install is somewhat incompatible with having the gems:/usr/local/bundle volume in docker-compose. Basically, on running the container, it's bundle folder will immediately be replaces by the contents of /gems. Of course, you still want the gems in the image for pushing, but in this case you might as well just copy them in COPY /gems /usr/local/bundle

@erdostom
Copy link
Author

The purpose of the volume is to persist the gems, so you only have to run bundle install in case the Gemfile changes (same with the node_modules).

@bhavik2936
Copy link

Dockerfile failed to build on line #9.
How should I provide that from host system.

COPY failed: file not found in build context or excluded by .dockerignore: stat package.json: file does not exist

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment