From 3f403c9e7aed6ef3f03d93c7589fe9f6237aa611 Mon Sep 17 00:00:00 2001 From: petebytes Date: Thu, 5 Dec 2019 04:12:46 -0700 Subject: [PATCH] =?UTF-8?q?Improve=20docker=20compose=20performance=20(#34?= =?UTF-8?q?7)=20=C2=A0=20=F0=9F=A4=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- config/webpacker.yml | 2 +- docker-compose.yaml | 42 +++++++++++++---- docker/Dockerfile | 32 ++++++++++--- docker/Procfile.docker.dev | 2 - docker/entrypoint.sh | 2 +- docs/development/project-setup/quick-setup.md | 45 ++++++++++--------- 6 files changed, 88 insertions(+), 37 deletions(-) delete mode 100644 docker/Procfile.docker.dev diff --git a/config/webpacker.yml b/config/webpacker.yml index e1bc412b7..1142329cf 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -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: diff --git a/docker-compose.yaml b/docker-compose.yaml index 446508e25..3c487612d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -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 diff --git a/docker/Dockerfile b/docker/Dockerfile index b99daf952..02c4d1374 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -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/ diff --git a/docker/Procfile.docker.dev b/docker/Procfile.docker.dev deleted file mode 100644 index e2d095a4b..000000000 --- a/docker/Procfile.docker.dev +++ /dev/null @@ -1,2 +0,0 @@ -backend: ../bin/rails server -b 0.0.0.0 -p 3000 -frontend: ../bin/webpack-dev-server \ No newline at end of file diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index eb40a5ea3..9b7e12d0b 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -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 "$@" \ No newline at end of file +exec "$@" diff --git a/docs/development/project-setup/quick-setup.md b/docs/development/project-setup/quick-setup.md index 96d5ff991..23b08e5ff 100644 --- a/docs/development/project-setup/quick-setup.md +++ b/docs/development/project-setup/quick-setup.md @@ -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 service’s 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)