2 # Copyright (C) The Arvados Authors. All rights reserved.
4 # SPDX-License-Identifier: AGPL-3.0
8 if ! test -d /sys/fs/cgroup ; then
9 echo "Arvbox requires cgroups to be mounted at /sys/fs/cgroup in order to use"
10 echo "Docker-in-Docker. Older operating systems that put cgroups in other"
11 echo "places (such as /cgroup) are not supported."
15 if ! which docker >/dev/null 2>/dev/null ; then
16 echo "Arvbox requires Docker. To install, run the following command as root:"
17 echo "curl -sSL https://get.docker.com/ | sh"
21 if test -z "$ARVBOX_DOCKER" ; then
22 if which greadlink >/dev/null 2>/dev/null ; then
23 ARVBOX_DOCKER=$(greadlink -f $(dirname $0)/../lib/arvbox/docker)
25 ARVBOX_DOCKER=$(readlink -f $(dirname $0)/../lib/arvbox/docker)
29 if test -z "$ARVBOX_CONTAINER" ; then
30 ARVBOX_CONTAINER=arvbox
33 if test -z "$ARVBOX_BASE" ; then
34 ARVBOX_BASE="$HOME/.arvbox"
37 if test -z "$ARVBOX_DATA" ; then
38 ARVBOX_DATA="$ARVBOX_BASE/$ARVBOX_CONTAINER"
41 if test -z "$ARVADOS_ROOT" ; then
42 ARVADOS_ROOT="$ARVBOX_DATA/arvados"
45 if test -z "$SSO_ROOT" ; then
46 SSO_ROOT="$ARVBOX_DATA/sso-devise-omniauth-provider"
49 if test -z "$COMPOSER_ROOT" ; then
50 COMPOSER_ROOT="$ARVBOX_DATA/composer"
53 if test -z "$WORKBENCH2_ROOT" ; then
54 WORKBENCH2_ROOT="$ARVBOX_DATA/workbench2"
57 PG_DATA="$ARVBOX_DATA/postgres"
58 VAR_DATA="$ARVBOX_DATA/var"
59 PASSENGER="$ARVBOX_DATA/passenger"
60 GEMS="$ARVBOX_DATA/gems"
61 PIPCACHE="$ARVBOX_DATA/pip"
62 NPMCACHE="$ARVBOX_DATA/npm"
63 GOSTUFF="$ARVBOX_DATA/gopath"
64 RLIBS="$ARVBOX_DATA/Rlibs"
67 docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $ARVBOX_CONTAINER
72 OVERRIDE=$(docker exec -i $ARVBOX_CONTAINER cat /var/run/localip_override 2>/dev/null)
75 if test "$CODE" = 0 ; then
83 docker exec $ARVBOX_CONTAINER cat /var/lib/arvados/api_uuid_prefix
87 if test -f ~/.config/arvados/$ARVBOX_CONTAINER.conf ; then
88 sed "s/ARVADOS_API_HOST=.*/ARVADOS_API_HOST=$(gethost):8000/" <$HOME/.config/arvados/$ARVBOX_CONTAINER.conf >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf.tmp
89 mv ~/.config/arvados/$ARVBOX_CONTAINER.conf.tmp ~/.config/arvados/$ARVBOX_CONTAINER.conf
91 mkdir -p $HOME/.config/arvados
92 cat >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf <<EOF
93 ARVADOS_API_HOST=$(gethost):8000
95 ARVADOS_API_HOST_INSECURE=true
101 FF=/tmp/arvbox-fifo-$$
103 docker logs -f $ARVBOX_CONTAINER > $FF &
106 if [[ $line =~ "ok: down: ready:" ]] ; then
109 wait $LOGPID 2>/dev/null
117 if test -n "$localip" ; then
118 echo "export ARVADOS_API_HOST=$localip:8000"
120 echo "export ARVADOS_API_HOST=$(gethost):8000"
126 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
127 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
128 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
129 "--volume=$WORKBENCH2_ROOT:/usr/src/workbench2:rw" \
130 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
131 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
132 "--volume=$PASSENGER:/var/lib/passenger:rw" \
133 "--volume=$GEMS:/var/lib/gems:rw" \
134 "--volume=$PIPCACHE:/var/lib/pip:rw" \
135 "--volume=$NPMCACHE:/var/lib/npm:rw" \
136 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
137 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
138 --label "org.arvados.arvbox_config=$CONFIG" \
143 docker inspect $ARVBOX_CONTAINER -f '{{index .Config.Labels "org.arvados.arvbox_config"}}'
154 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
155 if [[ $(running_config) != "$CONFIG" ]] ; then
156 echo "Container $ARVBOX_CONTAINER is '$(running_config)' config but requested '$CONFIG'; use restart or reboot"
159 if test "$CONFIG" = test -o "$CONFIG" = devenv ; then
162 echo "Container $ARVBOX_CONTAINER is already running"
167 if test $need_setup = 1 ; then
168 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
169 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or reboot"
176 if test $(echo $TAG | cut -c1-1) != '-' ; then
180 if [[ $TAG = '-' ]] ; then
187 if [[ "$CONFIG" =~ ^public ]] ; then
188 if test -n "$ARVBOX_PUBLISH_IP" ; then
189 localip=$ARVBOX_PUBLISH_IP
191 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
192 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
195 echo $localip > $iptemp
197 PUBLIC="--volume=$iptemp:/var/run/localip_override
204 --publish=25100:25100
205 --publish=25107:25107
206 --publish=25108:25108
213 if [[ "$CONFIG" =~ demo$ ]] ; then
214 if test -d "$ARVBOX_DATA" ; then
215 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
216 echo "Set environment variable ARVBOX_CONTAINER to set a different name for your demo container"
220 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
221 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
226 --name=$ARVBOX_CONTAINER \
228 --volumes-from $ARVBOX_CONTAINER-data \
229 --label "org.arvados.arvbox_config=$CONFIG" \
231 arvados/arvbox-demo$TAG
235 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$NPMCACHE" "$GOSTUFF" "$RLIBS"
237 if ! test -d "$ARVADOS_ROOT" ; then
238 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
240 if ! test -d "$SSO_ROOT" ; then
241 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
243 if ! test -d "$COMPOSER_ROOT" ; then
244 git clone https://github.com/curoverse/composer.git "$COMPOSER_ROOT"
246 if ! test -d "$WORKBENCH2_ROOT" ; then
247 git clone https://github.com/curoverse/arvados-workbench2.git "$WORKBENCH2_ROOT"
250 if [[ "$CONFIG" = test ]] ; then
252 mkdir -p $VAR_DATA/test
254 if test "$need_setup" = 1 ; then
257 --name=$ARVBOX_CONTAINER \
259 "--env=SVDIR=/etc/test-service" \
260 arvados/arvbox-dev$TAG
264 /usr/local/lib/arvbox/runsu.sh \
265 /usr/local/lib/arvbox/waitforpostgres.sh
269 /usr/local/lib/arvbox/runsu.sh \
270 /var/lib/arvbox/service/sso/run-service --only-setup
274 /usr/local/lib/arvbox/runsu.sh \
275 /var/lib/arvbox/service/api/run-service --only-setup
279 -e LINES=$(tput lines) \
280 -e COLUMNS=$(tput cols) \
282 -e WORKSPACE=/usr/src/arvados \
283 -e GEM_HOME=/var/lib/gems \
285 /usr/local/lib/arvbox/runsu.sh \
286 /usr/src/arvados/build/run-tests.sh \
287 --temp /var/lib/arvados/test \
289 elif [[ "$CONFIG" = devenv ]] ; then
290 if [[ $need_setup = 1 ]] ; then
293 --name=${ARVBOX_CONTAINER} \
294 "--env=SVDIR=/etc/devenv-service" \
295 "--volume=$HOME:$HOME:rw" \
296 --volume=/tmp/.X11-unix:/tmp/.X11-unix:rw \
297 arvados/arvbox-dev$TAG
299 exec docker exec --interactive --tty \
300 -e LINES=$(tput lines) \
301 -e COLUMNS=$(tput cols) \
303 -e "ARVBOX_HOME=$HOME" \
304 -e "DISPLAY=$DISPLAY" \
306 ${ARVBOX_CONTAINER} \
307 /usr/local/lib/arvbox/devenv.sh "$@"
308 elif [[ "$CONFIG" =~ dev$ ]] ; then
311 --name=$ARVBOX_CONTAINER \
314 arvados/arvbox-dev$TAG
317 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
318 echo "The Arvados testing root certificate is $VAR_DATA/root-cert.pem"
320 echo "Unknown configuration '$CONFIG'"
331 if test $(echo $TAG | cut -c1-1) != '-' ; then
339 if echo "$CONFIG" | grep 'demo$' ; then
340 docker pull arvados/arvbox-demo$TAG
342 docker pull arvados/arvbox-dev$TAG
347 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
348 docker stop $ARVBOX_CONTAINER
351 VOLUMES=--volumes=true
352 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
353 docker rm $VOLUMES $ARVBOX_CONTAINER
355 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
356 docker rm $VOLUMES $ARVBOX_CONTAINER
361 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
362 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
365 if docker --version |grep " 1\.[0-9]\." ; then
366 # Docker version prior 1.10 require -f flag
367 # -f flag removed in Docker 1.12
370 GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
371 docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
372 docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest
373 if test "$1" = localdemo -o "$1" = publicdemo ; then
374 docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
375 docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
377 docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
378 docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
384 localdemo|publicdemo|dev|publicdev|test|devenv)
388 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test, devenv"
395 if test -n "$subcmd" ; then
406 NO_CACHE=--no-cache build $@
415 exec docker exec --interactive --tty \
416 -e LINES=$(tput lines) \
417 -e COLUMNS=$(tput cols) \
419 -e GEM_HOME=/var/lib/gems \
420 $ARVBOX_CONTAINER /bin/bash
424 exec docker exec --interactive --tty \
425 -e LINES=$(tput lines) \
426 -e COLUMNS=$(tput cols) \
428 -e GEM_HOME=/var/lib/gems \
430 -w /usr/src/arvados \
431 $ARVBOX_CONTAINER /bin/bash --login
435 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
471 exec xdg-open http://$(gethost)
475 echo "Container: $ARVBOX_CONTAINER"
476 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
477 echo "Cluster id: $(getclusterid)"
478 echo "Status: running"
479 echo "Container IP: $(getip)"
480 echo "Published host: $(gethost)"
482 echo "Status: not running"
484 if test -d "$ARVBOX_DATA" ; then
485 echo "Data: $ARVBOX_DATA"
486 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
487 echo "Data: $ARVBOX_CONTAINER-data"
495 if test -d "$ARVBOX_DATA" ; then
496 if test "$subcmd" = destroy ; then
497 if test "$1" != -f ; then
498 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
499 echo "Use destroy -f if you really mean it."
503 rm -rf "$ARVBOX_DATA"
505 if test "$1" != -f ; then
506 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
507 echo "Code and downloaded packages will be preserved."
508 echo "Use reset -f if you really mean it."
512 rm -rf "$ARVBOX_DATA/postgres"
513 rm -rf "$ARVBOX_DATA/var"
516 if test "$1" != -f ; then
517 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
521 docker rm "$ARVBOX_CONTAINER-data"
526 if test -n "$1" ; then
527 exec docker exec -ti -e LINES=$(tput lines) -e COLUMNS=$(tput cols) -e TERM=$TERM $ARVBOX_CONTAINER less --follow-name -R +GF "/etc/service/$1/log/main/current"
529 exec docker exec -ti $ARVBOX_CONTAINER tail $(docker exec -ti $ARVBOX_CONTAINER find -L /etc -path '/etc/service/*/log/main/current' -printf " %p")
534 if test -n "$1" ; then
535 exec docker exec $ARVBOX_CONTAINER cat "$@"
537 echo "Usage: $0 $subcmd <files>"
542 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
546 if test -n "$1" -a -n "$2" ; then
547 exec docker exec $ARVBOX_CONTAINER sv "$@"
549 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
550 echo "Available services:"
551 exec docker execa $ARVBOX_CONTAINER ls /etc/service
556 if test -n "$2" ; then
557 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
558 echo "Created new arvbox $2"
559 echo "export ARVBOX_CONTAINER=$2"
561 echo "clone <from> <to> clone an arvbox"
562 echo "available arvboxes: $(ls $ARVBOX_BASE)"
567 CERT=$PWD/${ARVBOX_CONTAINER}-root-cert.crt
568 if test -n "$1" ; then
571 docker exec $ARVBOX_CONTAINER cat /var/lib/arvados/root-cert.pem > "$CERT"
572 echo "Certificate copied to $CERT"
576 exec docker exec -ti $ARVBOX_CONTAINER bash -c 'PGPASSWORD=$(cat /var/lib/arvados/api_database_pw) exec psql --dbname=arvados_development --host=localhost --username=arvados'
580 echo "Arvados-in-a-box https://doc.arvados.org/install/arvbox.html"
582 echo "start|run <config> [tag] start $ARVBOX_CONTAINER container"
583 echo "stop stop arvbox container"
584 echo "restart <config> stop, then run again"
585 echo "status print some information about current arvbox"
586 echo "ip print arvbox docker container ip address"
587 echo "host print arvbox published host"
588 echo "shell enter shell as root"
589 echo "ashell enter shell as 'arvbox'"
590 echo "psql enter postgres console"
591 echo "open open arvbox workbench in a web browser"
592 echo "root-cert get copy of root certificate"
593 echo "update <config> stop, pull latest image, run"
594 echo "build <config> build arvbox Docker image"
595 echo "reboot <config> stop, build arvbox Docker image, run"
596 echo "rebuild <config> build arvbox Docker image, no layer cache"
597 echo "reset delete arvbox arvados data (be careful!)"
598 echo "destroy delete all arvbox code and data (be careful!)"
599 echo "log <service> tail log of specified service"
600 echo "ls <options> list directories inside arvbox"
601 echo "cat <files> get contents of files inside arvbox"
602 echo "pipe run a bash script piped in from stdin"
603 echo "sv <start|stop|restart> <service> "
604 echo " change state of service inside arvbox"
605 echo "clone <from> <to> clone dev arvbox"