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 compile: true
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules # 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/ # Reference: https://webpack.js.org/configuration/dev-server/
dev_server: dev_server:

View file

@ -1,12 +1,27 @@
version: '3' version: '3'
volumes:
postgres:
redis:
bundle:
packs:
node_modules:
services: services:
server: &server server: &server
build: build:
context: . context: .
dockerfile: ./docker/Dockerfile dockerfile: ./docker/Dockerfile
args:
BUNDLE_WITHOUT: ''
RAILS_ENV: 'development'
RAILS_SERVE_STATIC_FILES: 'false'
volumes: volumes:
- ./:/app - ./:/app:cached
- bundle:/bundle:delegated
- packs:/app/public/packs
- node_modules:/app/node_modules
links: links:
- postgres - postgres
- redis - redis
@ -16,8 +31,25 @@ services:
- REDIS_URL=redis://redis:6379 - REDIS_URL=redis://redis:6379
- POSTGRES_HOST=postgres - POSTGRES_HOST=postgres
- RAILS_ENV=development - 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: postgres:
image: postgres:9.6 image: postgres:9.6
restart: always restart: always
@ -37,9 +69,3 @@ services:
- redis:/data/redis - redis:/data/redis
ports: ports:
- '6379:6379' - '6379:6379'
volumes:
postgres:
external: true
redis:
external: true

View file

@ -1,5 +1,16 @@
FROM ruby:2.6.5-slim 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 \ RUN apt-get update \
&& apt-get -qq -y install \ && apt-get -qq -y install \
build-essential \ build-essential \
@ -18,13 +29,24 @@ RUN apt-get update \
RUN mkdir -p /app RUN mkdir -p /app
WORKDIR /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 COPY . /app
ENV RAILS_SERVE_STATIC_FILES true # generate production assets if production environment
ENV RAILS_ENV=production RUN if [ "$RAILS_ENV" = "production" ]; then \
SECRET_KEY_BASE=precompile_placeholder bundle exec rake assets:precompile; \
RUN bundle fi
RUN SECRET_KEY_BASE=precompile_placeholder bundle exec rake assets:precompile
# Add a script to be executed every time the container starts. # Add a script to be executed every time the container starts.
COPY ./docker/entrypoint.sh /usr/bin/ 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

@ -42,40 +42,45 @@ password: 123456
### Docker for development ### Docker for development
If you are using docker for the development follow the following steps. The first time you start your development environment run the following two commands:
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.
```bash ```bash
docker volume create --name=postgres # build and start the services
docker volume create --name=redis 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 docker-compose build
``` ```
Remove the `node_modules` directory from the root if it exists and run the following command.
```bash The docker-compose environment consists of:
docker-compose run server yarn install - 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 : If in case you encounter a seeding issue or you want reset the database you can do it using the following command :
```bash ```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. 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 ### 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) You can use our official Docker image from [https://hub.docker.com/r/chatwoot/chatwoot](https://hub.docker.com/r/chatwoot/chatwoot)