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 PG_DATA="$ARVBOX_DATA/postgres"
54 VAR_DATA="$ARVBOX_DATA/var"
55 PASSENGER="$ARVBOX_DATA/passenger"
56 GEMS="$ARVBOX_DATA/gems"
57 PIPCACHE="$ARVBOX_DATA/pip"
58 NPMCACHE="$ARVBOX_DATA/npm"
59 GOSTUFF="$ARVBOX_DATA/gopath"
60 RLIBS="$ARVBOX_DATA/Rlibs"
63 docker inspect $ARVBOX_CONTAINER | grep \"IPAddress\" | head -n1 | tr -d ' ":,\n' | cut -c10-
68 OVERRIDE=$(docker exec -i $ARVBOX_CONTAINER cat /var/run/localip_override 2>/dev/null)
71 if test "$CODE" = 0 ; then
79 if test -f ~/.config/arvados/$ARVBOX_CONTAINER.conf ; then
80 sed "s/ARVADOS_API_HOST=.*/ARVADOS_API_HOST=$(gethost):8000/" <$HOME/.config/arvados/$ARVBOX_CONTAINER.conf >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf.tmp
81 mv ~/.config/arvados/$ARVBOX_CONTAINER.conf.tmp ~/.config/arvados/$ARVBOX_CONTAINER.conf
83 mkdir -p $HOME/.config/arvados
84 cat >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf <<EOF
85 ARVADOS_API_HOST=$(gethost):8000
87 ARVADOS_API_HOST_INSECURE=true
93 FF=/tmp/arvbox-fifo-$$
95 docker logs -f $ARVBOX_CONTAINER > $FF &
99 if echo $line | grep "Workbench is running at" >/dev/null ; then
105 if test -n "$localip" ; then
106 echo "export ARVADOS_API_HOST=$localip:8000"
108 echo "export ARVADOS_API_HOST=$(gethost):8000"
120 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
121 if test "$CONFIG" = test ; then
124 echo "Container $ARVBOX_CONTAINER is already running"
129 if test $need_setup = 1 ; then
130 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
131 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or reboot"
138 if test $(echo $TAG | cut -c1-1) != '-' ; then
146 if echo "$CONFIG" | grep '^public' ; then
147 if test -n "$ARVBOX_PUBLISH_IP" ; then
148 localip=$ARVBOX_PUBLISH_IP
150 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
151 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
154 echo $localip > $iptemp
156 PUBLIC="--volume=$iptemp:/var/run/localip_override
162 --publish=25100:25100
163 --publish=25107:25107
164 --publish=25108:25108
171 if echo "$CONFIG" | grep 'demo$' ; then
172 if test -d "$ARVBOX_DATA" ; then
173 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
174 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
178 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
179 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
184 --name=$ARVBOX_CONTAINER \
186 --volumes-from $ARVBOX_CONTAINER-data \
188 arvados/arvbox-demo$TAG
192 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$NPMCACHE" "$GOSTUFF" "$RLIBS"
195 if ! test -d "$ARVADOS_ROOT" ; then
196 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
198 if ! test -d "$SSO_ROOT" ; then
199 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
201 if ! test -d "$COMPOSER_ROOT" ; then
202 git clone https://github.com/curoverse/composer.git "$COMPOSER_ROOT"
205 if test "$CONFIG" = test ; then
207 mkdir -p $VAR_DATA/test
209 if test "$need_setup" = 1 ; then
212 --name=$ARVBOX_CONTAINER \
214 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
215 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
216 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
217 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
218 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
219 "--volume=$PASSENGER:/var/lib/passenger:rw" \
220 "--volume=$GEMS:/var/lib/gems:rw" \
221 "--volume=$PIPCACHE:/var/lib/pip:rw" \
222 "--volume=$NPMCACHE:/var/lib/npm:rw" \
223 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
224 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
225 "--env=SVDIR=/etc/test-service" \
226 arvados/arvbox-dev$TAG
230 /usr/local/lib/arvbox/runsu.sh \
231 /usr/local/lib/arvbox/waitforpostgres.sh
235 /usr/local/lib/arvbox/runsu.sh \
236 /var/lib/arvbox/service/sso/run-service --only-setup
240 /usr/local/lib/arvbox/runsu.sh \
241 /var/lib/arvbox/service/api/run-service --only-setup
246 /usr/local/lib/arvbox/runsu.sh \
247 /usr/src/arvados/build/run-tests.sh \
248 --temp /var/lib/arvados/test \
249 WORKSPACE=/usr/src/arvados \
250 GEM_HOME=/var/lib/gems \
252 elif echo "$CONFIG" | grep 'dev$' ; then
255 --name=$ARVBOX_CONTAINER \
257 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
258 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
259 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
260 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
261 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
262 "--volume=$PASSENGER:/var/lib/passenger:rw" \
263 "--volume=$GEMS:/var/lib/gems:rw" \
264 "--volume=$PIPCACHE:/var/lib/pip:rw" \
265 "--volume=$NPMCACHE:/var/lib/npm:rw" \
266 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
267 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
269 arvados/arvbox-dev$TAG
272 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
274 echo "Unknown configuration '$CONFIG'"
280 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
281 docker stop $ARVBOX_CONTAINER
284 VOLUMES=--volumes=true
285 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
286 docker rm $VOLUMES $ARVBOX_CONTAINER
288 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
289 docker rm $VOLUMES $ARVBOX_CONTAINER
294 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
295 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
298 if docker --version |grep " 1\.[0-9]\." ; then
299 # Docker version prior 1.10 require -f flag
300 # -f flag removed in Docker 1.12
303 GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
304 docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
305 docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest
306 if test "$1" = localdemo -o "$1" = publicdemo ; then
307 docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
308 docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
310 docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
311 docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
317 localdemo|publicdemo|dev|publicdev|test)
321 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
328 if test -n "$subcmd" ; then
339 NO_CACHE=--no-cache build $@
348 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM GEM_HOME=/var/lib/gems /bin/bash
352 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
381 exec xdg-open http://$(gethost)
385 echo "Selected: $ARVBOX_CONTAINER"
386 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
387 echo "Status: running"
388 echo "Container IP: $(getip)"
389 echo "Published host: $(gethost)"
391 echo "Status: not running"
393 if test -d "$ARVBOX_DATA" ; then
394 echo "Data: $ARVBOX_DATA"
395 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
396 echo "Data: $ARVBOX_CONTAINER-data"
404 if test -d "$ARVBOX_DATA" ; then
405 if test "$subcmd" = destroy ; then
406 if test "$1" != -f ; then
407 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
408 echo "Use destroy -f if you really mean it."
412 rm -rf "$ARVBOX_DATA"
414 if test "$1" != -f ; then
415 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
416 echo "Code and downloaded packages will be preserved."
417 echo "Use reset -f if you really mean it."
421 rm -rf "$ARVBOX_DATA/postgres"
422 rm -rf "$ARVBOX_DATA/var"
425 if test "$1" != -f ; then
426 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
430 docker rm "$ARVBOX_CONTAINER-data"
435 if test -n "$1" ; then
436 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name -R +GF "/etc/service/$1/log/main/current"
438 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM tail $(docker exec -ti $ARVBOX_CONTAINER find -L /etc -path '/etc/service/*/log/main/current' -printf " %p")
443 if test -n "$1" ; then
444 exec docker exec $ARVBOX_CONTAINER cat "$@"
446 echo "Usage: $0 $subcmd <files>"
451 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
455 if test -n "$1" -a -n "$2" ; then
456 exec docker exec -ti $ARVBOX_CONTAINER sv "$@"
458 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
459 echo "Available services:"
460 exec docker exec -ti $ARVBOX_CONTAINER ls /etc/service
465 if test -n "$2" ; then
466 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
467 echo "Created new arvbox $2"
468 echo "export ARVBOX_CONTAINER=$2"
470 echo "clone <from> <to> clone an arvbox"
471 echo "available arvboxes: $(ls $ARVBOX_BASE)"
476 echo "Arvados-in-a-box http://arvados.org"
478 echo "build <config> build arvbox Docker image"
479 echo "rebuild <config> build arvbox Docker image, no layer cache"
480 echo "start|run <config> [tag] start $ARVBOX_CONTAINER container"
481 echo "open open arvbox workbench in a web browser"
482 echo "shell enter arvbox shell"
483 echo "ip print arvbox docker container ip address"
484 echo "host print arvbox published host"
485 echo "status print some information about current arvbox"
486 echo "stop stop arvbox container"
487 echo "restart <config> stop, then run again"
488 echo "reboot <config> stop, build arvbox Docker image, run"
489 echo "reset delete arvbox arvados data (be careful!)"
490 echo "destroy delete all arvbox code and data (be careful!)"
491 echo "log <service> tail log of specified service"
492 echo "ls <options> list directories inside arvbox"
493 echo "cat <files> get contents of files inside arvbox"
494 echo "pipe run a bash script piped in from stdin"
495 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
496 echo "clone <from> <to> clone an arvbox"