Improve docker compose performance (#347)   🤩

* Fix warning Integrity check: System parameters don't match

* Reduce commands required to use docker-compose and update quick-setup doc

Data will still persist when stopping and restarting containers.
To destroy the data can use docker-compose down --volumes

* Moved webpacker-dev-server to its own service

* cache bundle and yarn - improve volume performance - env conditional statements

* Fix inconsistent build results found during testing
This commit is contained in:
petebytes 2019-12-05 04:12:46 -07:00 committed by Sony Mathew
parent 3a1c0aef07
commit 3f403c9e7a
6 changed files with 88 additions and 37 deletions

View file

@ -54,7 +54,7 @@ development:
compile: true
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: true
check_yarn_integrity: false
# Reference: https://webpack.js.org/configuration/dev-server/
dev_server:

View file

@ -1,12 +1,27 @@
version: '3'
volumes:
postgres:
redis:
bundle:
packs:
node_modules:
services:
server: &server
build:
context: .
dockerfile: ./docker/Dockerfile
args:
BUNDLE_WITHOUT: ''
RAILS_ENV: 'development'
RAILS_SERVE_STATIC_FILES: 'false'
volumes:
- ./:/app
- ./:/app:cached
- bundle:/bundle:delegated
- packs:/app/public/packs
- node_modules:/app/node_modules
links:
- postgres
- redis
@ -16,8 +31,25 @@ services:
- REDIS_URL=redis://redis:6379
- POSTGRES_HOST=postgres
- RAILS_ENV=development
command: ["foreman", "start", "-f", "./docker/Procfile.docker.dev"]
- WEBPACKER_DEV_SERVER_HOST=webpacker
command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"]
webpacker:
<<: *server
command: ./bin/webpack-dev-server
depends_on:
- "server"
ports:
- '3035:3035'
volumes:
- .:/app:cached
- bundle:/bundle
- node_modules:/app/node_modules
- packs:/app/public/packs
environment:
- "NODE_ENV=development"
- "RAILS_ENV=development"
- "WEBPACKER_DEV_SERVER_HOST=0.0.0.0"
postgres:
image: postgres:9.6
restart: always
@ -37,9 +69,3 @@ services:
- redis:/data/redis
ports:
- '6379:6379'
volumes:
postgres:
external: true
redis:
external: true

View file

@ -1,5 +1,16 @@
FROM ruby:2.6.5-slim
# ARG default to production settings
# For development docker-compose file overrides ARGS
ARG BUNDLE_WITHOUT="development:test"
ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT}
ARG RAILS_SERVE_STATIC_FILES=true
ENV RAILS_SERVE_STATIC_FILES ${RAILS_SERVE_STATIC_FILES}
ARG RAILS_ENV=production
ENV RAILS_ENV ${RAILS_ENV}
RUN apt-get update \
&& apt-get -qq -y install \
build-essential \
@ -18,13 +29,24 @@ RUN apt-get update \
RUN mkdir -p /app
WORKDIR /app
COPY Gemfile Gemfile.lock ./
# Do not install development or test gems in production
RUN if [ "$RAILS_ENV" = "production" ]; then \
bundle install -j 4 -r 3 --without development test; \
else bundle install -j 4 -r 3; \
fi
COPY package.json yarn.lock ./
RUN yarn install
COPY . /app
ENV RAILS_SERVE_STATIC_FILES true
ENV RAILS_ENV=production
RUN bundle
RUN SECRET_KEY_BASE=precompile_placeholder bundle exec rake assets:precompile
# generate production assets if production environment
RUN if [ "$RAILS_ENV" = "production" ]; then \
SECRET_KEY_BASE=precompile_placeholder bundle exec rake assets:precompile; \
fi
# Add a script to be executed every time the container starts.
COPY ./docker/entrypoint.sh /usr/bin/

View file

@ -1,2 +0,0 @@
backend: ../bin/rails server -b 0.0.0.0 -p 3000
frontend: ../bin/webpack-dev-server

View file

@ -5,4 +5,4 @@ set -e
rm -f /app/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
exec "$@"

View file

@ -42,40 +42,45 @@ password: 123456
### Docker for development
If you are using docker for the development follow the following steps.
We are running postgres and redis services along with chatwoot server using docker-compose.
Create a volume for postgres and redis so that you data will persist even if the containers goes down.
The first time you start your development environment run the following two commands:
```bash
docker volume create --name=postgres
docker volume create --name=redis
# build and start the services
docker-compose up --build
# prepare the database
docker-compose exec server bundle exec rails db:prepare
```
Then browse http://localhost:3000
```bash
# To stop your environment use Control+C (on Mac) CTRL+C (on Win) or
docker-compose down
# start the services
docker-compose up
```
When you change the services Dockerfile or the contents of the build directory, run stop then build. (For example after modifying package.json or Gemfile)
```bash
docker-compose stop
docker-compose build
```
Remove the `node_modules` directory from the root if it exists and run the following command.
```bash
docker-compose run server yarn install
```
The docker-compose environment consists of:
- chatwoot server
- postgres
- redis
- webpacker-dev-server
If in case you encounter a seeding issue or you want reset the database you can do it using the following command :
```bash
docker-compose run server bundle exec rake db:reset
docker-compose run -rm server bundle exec rake db:reset
```
This command essentially runs postgres and redis containers and then run the rake command inside the chatwoot server container.
Now you should be able to run :
```bash
docker-compose up
```
to see the application up and running.
### Docker for production
You can use our official Docker image from [https://hub.docker.com/r/chatwoot/chatwoot](https://hub.docker.com/r/chatwoot/chatwoot)