OpenProject is the leading open source project management software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openproject/bin/compose

77 lines
2.7 KiB

#!/bin/bash
set -e
Speed up `bin/compose setup` significantly (#9404) With the proposed changes the time required to run `./bin/compose setup` is being reduced from ~18 minutes down to ~7 minutes on my machine. In addition a workaround is applied to reduce the size of the images. == Changes === Speed-Up `bundle install` The time spent withing `bundle install` takes a significant amount time during the `./bin/compose setup`. We could make use of two improvements, which both allows us to utitlize multiple CPU cures: * Make use of the bundle `--jobs` argument * Make use of the lesser known/used `MAKE` environment variable A significant amount of time spent during `bundle install` is actually compiling C-extensions, that's why the usage of the `MAKE` variable will drastically improve performence. === `useradd --no-log-init` Unfortunately there is a nasty bug when running `useradd` for a huge `uid`, which could result in excessive image sizes. See attached links for more information. === BuildKit BuildKit is the default builder toolkit for Docker on Windows and DockerDesktop on Macs. Using BuildKit will greatly improve performance when building docker images. == Links === Speed-Up `bundle install` * [One Weird Trick That Will Speed Up Your Bundle Install](https://build.betterup.com/one-weird-trick-that-will-speed-up-your-bundle-install/) === BuildKit * [Build images with BuildKit](https://docs.docker.com/develop/develop-images/build_enhancements/) * [Faster builds in Docker Compose 1.25.1 thanks to BuildKit Support](https://www.docker.com/blog/faster-builds-in-compose-thanks-to-buildkit-support/) === `useradd --no-log-init` * Best practices for writing Dockerfiles: [User](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) * golang/co: [archive/tar: add support for writing tar containing sparse files](https://github.com/golang/go/issues/13548)
3 years ago
export COMPOSE_DOCKER_CLI_BUILD=1
export DOCKER_BUILDKIT=1
if [ -f .env ]; then
export `grep -v '^#' .env | xargs`
else
export DEV_UID=$(id -u) DEV_GID=$(id -g) LOCAL_DEV_CHECK=1
fi
COMPOSE_FILE=docker-compose.yml
if [ $# -eq 0 ]; then
echo "Usage: bin/compose <command> [args*]"
echo
echo "Commands:"
echo " setup - Has to be run once initially. Installs backend and frontend dependencies. "
echo " reset - Resets everything by removing all containers and deleting all volumes. You need to run \`setup\` again afterwards. "
echo " start - Starts both backend and frontend in the background. Access via http://localhost:3000/ by default."
echo " run - Starts the frontend in the background and backend in the foreground. Useful for debugging using pry."
echo " rspec - Runs rspec inside the \`backend-test\` container which will be started if it's not running yet."
echo " * - Everything else will be passed straight to \`docker-compose\`."
echo
exit 1
fi
if [ -f config/database.yml ]; then
echo
printf "\033[0;31mError\033[0m: Found local \`config/database.yml\` - The docker setup will not work with this file present."
echo " You could delete it or rename it for the time being."
exit 1
fi
if command -v docker-compose &> /dev/null
then
DOCKER_COMPOSE="docker-compose"
else
DOCKER_COMPOSE="docker compose"
fi
if [[ "$@" = "start" ]]; then
# backend will be started automatically as a dependency of the frontend
$DOCKER_COMPOSE -f $COMPOSE_FILE up -d frontend
elif [[ "$@" = "run" ]]; then
$DOCKER_COMPOSE -f $COMPOSE_FILE up -d frontend
$DOCKER_COMPOSE -f $COMPOSE_FILE stop backend
$DOCKER_COMPOSE -f $COMPOSE_FILE run --rm backend rm -f tmp/pids/server.pid # delete if necessary so new server can come up
$DOCKER_COMPOSE -f $COMPOSE_FILE run --rm -p ${PORT:-3000}:3000 --name rails backend # run backend in TTY so you can debug using pry for instance
elif [[ "$1" = "setup" ]]; then
$DOCKER_COMPOSE -f $COMPOSE_FILE run backend setup
yes no | $DOCKER_COMPOSE -f $COMPOSE_FILE run frontend npm install
elif [[ "$1" = "reset" ]]; then
$DOCKER_COMPOSE -f $COMPOSE_FILE down && docker volume rm `docker volume ls -q | grep ${PWD##*/}_`
elif [[ "$1" = "rspec" ]]; then
if ! docker ps | grep ${PWD##*/}_backend-test_1 > /dev/null; then
echo "Test backend not running yet. Starting it..."
$DOCKER_COMPOSE -f $COMPOSE_FILE up -d backend-test
while ! docker logs --since 1m ${PWD##*/}_backend-test_1 | grep "Ready for tests" > /dev/null; do
sleep 1
printf "."
done
echo "Ready for tests"
fi
$DOCKER_COMPOSE -f $COMPOSE_FILE exec backend-test bundle exec rspec "${@:2}"
else
$DOCKER_COMPOSE -f $COMPOSE_FILE $*
fi