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 $ARVBOX_CONTAINER | grep \"IPAddress\" | head -n1 | tr -d ' ":,\n' | cut -c10-
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 echo $line | grep "ok: down: ready:" >/dev/null ; then
114 if test -n "$localip" ; then
115 echo "export ARVADOS_API_HOST=$localip:8000"
117 echo "export ARVADOS_API_HOST=$(gethost):8000"
129 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
130 if test "$CONFIG" = test ; then
133 echo "Container $ARVBOX_CONTAINER is already running"
138 if test $need_setup = 1 ; then
139 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
140 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or reboot"
147 if test $(echo $TAG | cut -c1-1) != '-' ; then
155 if echo "$CONFIG" | grep '^public' ; then
156 if test -n "$ARVBOX_PUBLISH_IP" ; then
157 localip=$ARVBOX_PUBLISH_IP
159 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
160 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
163 echo $localip > $iptemp
165 PUBLIC="--volume=$iptemp:/var/run/localip_override
172 --publish=25100:25100
173 --publish=25107:25107
174 --publish=25108:25108
181 if echo "$CONFIG" | grep 'demo$' ; then
182 if test -d "$ARVBOX_DATA" ; then
183 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
184 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
188 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
189 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
194 --name=$ARVBOX_CONTAINER \
196 --volumes-from $ARVBOX_CONTAINER-data \
198 arvados/arvbox-demo$TAG
202 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$NPMCACHE" "$GOSTUFF" "$RLIBS"
205 if ! test -d "$ARVADOS_ROOT" ; then
206 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
208 if ! test -d "$SSO_ROOT" ; then
209 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
211 if ! test -d "$COMPOSER_ROOT" ; then
212 git clone https://github.com/curoverse/composer.git "$COMPOSER_ROOT"
214 if ! test -d "$WORKBENCH2_ROOT" ; then
215 git clone https://github.com/curoverse/arvados-workbench2.git "$WORKBENCH2_ROOT"
218 if test "$CONFIG" = test ; then
220 mkdir -p $VAR_DATA/test
222 if test "$need_setup" = 1 ; then
225 --name=$ARVBOX_CONTAINER \
227 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
228 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
229 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
230 "--volume=$WORKBENCH2_ROOT:/usr/src/workbench2:rw" \
231 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
232 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
233 "--volume=$PASSENGER:/var/lib/passenger:rw" \
234 "--volume=$GEMS:/var/lib/gems:rw" \
235 "--volume=$PIPCACHE:/var/lib/pip:rw" \
236 "--volume=$NPMCACHE:/var/lib/npm:rw" \
237 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
238 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
239 "--env=SVDIR=/etc/test-service" \
240 arvados/arvbox-dev$TAG
244 /usr/local/lib/arvbox/runsu.sh \
245 /usr/local/lib/arvbox/waitforpostgres.sh
249 /usr/local/lib/arvbox/runsu.sh \
250 /var/lib/arvbox/service/sso/run-service --only-setup
254 /usr/local/lib/arvbox/runsu.sh \
255 /var/lib/arvbox/service/api/run-service --only-setup
260 /usr/local/lib/arvbox/runsu.sh \
261 /usr/src/arvados/build/run-tests.sh \
262 --temp /var/lib/arvados/test \
263 WORKSPACE=/usr/src/arvados \
264 GEM_HOME=/var/lib/gems \
266 elif echo "$CONFIG" | grep 'dev$' ; then
269 --name=$ARVBOX_CONTAINER \
271 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
272 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
273 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
274 "--volume=$WORKBENCH2_ROOT:/usr/src/workbench2:rw" \
275 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
276 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
277 "--volume=$PASSENGER:/var/lib/passenger:rw" \
278 "--volume=$GEMS:/var/lib/gems:rw" \
279 "--volume=$PIPCACHE:/var/lib/pip:rw" \
280 "--volume=$NPMCACHE:/var/lib/npm:rw" \
281 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
282 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
284 arvados/arvbox-dev$TAG
287 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
288 echo "The Arvados testing root certificate is $VAR_DATA/root-cert.pem"
290 echo "Unknown configuration '$CONFIG'"
296 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
297 docker stop $ARVBOX_CONTAINER
300 VOLUMES=--volumes=true
301 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
302 docker rm $VOLUMES $ARVBOX_CONTAINER
304 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
305 docker rm $VOLUMES $ARVBOX_CONTAINER
310 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
311 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
314 if docker --version |grep " 1\.[0-9]\." ; then
315 # Docker version prior 1.10 require -f flag
316 # -f flag removed in Docker 1.12
319 GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
320 docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
321 docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest
322 if test "$1" = localdemo -o "$1" = publicdemo ; then
323 docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
324 docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
326 docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
327 docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
333 localdemo|publicdemo|dev|publicdev|test)
337 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
344 if test -n "$subcmd" ; then
355 NO_CACHE=--no-cache build $@
364 exec docker exec -ti \
365 -e LINES=$(tput lines) \
366 -e COLUMNS=$(tput cols) \
368 -e GEM_HOME=/var/lib/gems \
369 $ARVBOX_CONTAINER /bin/bash
373 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
402 exec xdg-open http://$(gethost)
406 echo "Container: $ARVBOX_CONTAINER"
407 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
408 echo "Cluster id: $(getclusterid)"
409 echo "Status: running"
410 echo "Container IP: $(getip)"
411 echo "Published host: $(gethost)"
413 echo "Status: not running"
415 if test -d "$ARVBOX_DATA" ; then
416 echo "Data: $ARVBOX_DATA"
417 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
418 echo "Data: $ARVBOX_CONTAINER-data"
426 if test -d "$ARVBOX_DATA" ; then
427 if test "$subcmd" = destroy ; then
428 if test "$1" != -f ; then
429 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
430 echo "Use destroy -f if you really mean it."
434 rm -rf "$ARVBOX_DATA"
436 if test "$1" != -f ; then
437 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
438 echo "Code and downloaded packages will be preserved."
439 echo "Use reset -f if you really mean it."
443 rm -rf "$ARVBOX_DATA/postgres"
444 rm -rf "$ARVBOX_DATA/var"
447 if test "$1" != -f ; then
448 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
452 docker rm "$ARVBOX_CONTAINER-data"
457 if test -n "$1" ; then
458 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"
460 exec docker exec -ti $ARVBOX_CONTAINER tail $(docker exec -ti $ARVBOX_CONTAINER find -L /etc -path '/etc/service/*/log/main/current' -printf " %p")
465 if test -n "$1" ; then
466 exec docker exec $ARVBOX_CONTAINER cat "$@"
468 echo "Usage: $0 $subcmd <files>"
473 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
477 if test -n "$1" -a -n "$2" ; then
478 exec docker exec $ARVBOX_CONTAINER sv "$@"
480 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
481 echo "Available services:"
482 exec docker execa $ARVBOX_CONTAINER ls /etc/service
487 if test -n "$2" ; then
488 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
489 echo "Created new arvbox $2"
490 echo "export ARVBOX_CONTAINER=$2"
492 echo "clone <from> <to> clone an arvbox"
493 echo "available arvboxes: $(ls $ARVBOX_BASE)"
498 echo "Arvados-in-a-box http://arvados.org"
500 echo "build <config> build arvbox Docker image"
501 echo "rebuild <config> build arvbox Docker image, no layer cache"
502 echo "start|run <config> [tag] start $ARVBOX_CONTAINER container"
503 echo "open open arvbox workbench in a web browser"
504 echo "shell enter arvbox shell"
505 echo "ip print arvbox docker container ip address"
506 echo "host print arvbox published host"
507 echo "status print some information about current arvbox"
508 echo "stop stop arvbox container"
509 echo "restart <config> stop, then run again"
510 echo "reboot <config> stop, build arvbox Docker image, run"
511 echo "reset delete arvbox arvados data (be careful!)"
512 echo "destroy delete all arvbox code and data (be careful!)"
513 echo "log <service> tail log of specified service"
514 echo "ls <options> list directories inside arvbox"
515 echo "cat <files> get contents of files inside arvbox"
516 echo "pipe run a bash script piped in from stdin"
517 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
518 echo "clone <from> <to> clone an arvbox"