docker run --rm -it -v ${PWD}:/usr/src -w /usr/src ruby:3.2.1 sh -c 'gem install rails:"~>7.0.4" && rails new --database=postgresql <app_name>'
-
cd
into project directory$ cd <app_name>
-
Create bin/docker-entrypoint.sh:
#!/bin/bash set -e # Remove a potentially pre-existing server.pid file. rm -f /usr/src/app/tmp/pids/server.pid echo "bundle install..." bundle check || bundle install --jobs 4 # Execute container's main process (CMD in Dockerfile). exec "$@"
-
Add Dockerfile:
FROM ruby:3.2.1-slim RUN apt-get update -qq && apt-get install -yq --no-install-recommends \ build-essential \ gnupg2 \ less \ git \ libpq-dev \ postgresql-client \ libvips \ chromium \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ENV LANG=C.UTF-8 BUNDLE_JOBS=4 BUNDLE_RETRY=3 RUN gem update --system && gem install bundler WORKDIR /usr/src/app ENTRYPOINT ["./bin/docker-entrypoint.sh"] EXPOSE 3000 CMD ["bin/rails", "server", "-b", "0.0.0.0"]
-
Add docker-compose.yml:
services: app: build: . environment: - HISTFILE=/usr/src/app/log/.bash_history - PGHOST=db - PGUSER=postgres - PGPASSWORD=<db_password> ports: - 3000:3000 volumes: - .:/usr/src/app - bundle:/usr/local/bundle depends_on: - db - redis db: image: postgres:15 environment: - POSTGRES_PASSWORD=<db_password> ports: - 5432:5432 volumes: - pg_data:/var/lib/postgresql/data redis: image: redis volumes: - redis_data:/data volumes: pg_data: redis_data: bundle:
-
(Optional) Add handy bin files to access containers:
- bin/dstart
#!/bin/bash set -euo pipefail docker-compose up -d
- bin/denter
#!/bin/bash set -euo pipefail docker-compose exec web bash
- bin/dconsole
#!/bin/bash set -euo pipefail docker-compose exec web rails console
-
Make added bin files executable:
$ chmod +x d*
$ docker-compose build
$ bin/dstart
$ docker-compose exec web rails db:create