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"
123 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
124 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
125 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
126 "--volume=$WORKBENCH2_ROOT:/usr/src/workbench2:rw" \
127 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
128 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
129 "--volume=$PASSENGER:/var/lib/passenger:rw" \
130 "--volume=$GEMS:/var/lib/gems:rw" \
131 "--volume=$PIPCACHE:/var/lib/pip:rw" \
132 "--volume=$NPMCACHE:/var/lib/npm:rw" \
133 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
134 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
146 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
147 if test "$CONFIG" = test ; then
150 echo "Container $ARVBOX_CONTAINER is already running"
155 if test $need_setup = 1 ; then
156 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
157 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or reboot"
164 if test $(echo $TAG | cut -c1-1) != '-' ; then
172 if echo "$CONFIG" | grep '^public' ; then
173 if test -n "$ARVBOX_PUBLISH_IP" ; then
174 localip=$ARVBOX_PUBLISH_IP
176 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
177 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
180 echo $localip > $iptemp
182 PUBLIC="--volume=$iptemp:/var/run/localip_override
189 --publish=25100:25100
190 --publish=25107:25107
191 --publish=25108:25108
198 if echo "$CONFIG" | grep 'demo$' ; then
199 if test -d "$ARVBOX_DATA" ; then
200 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
201 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
205 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
206 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
211 --name=$ARVBOX_CONTAINER \
213 --volumes-from $ARVBOX_CONTAINER-data \
215 arvados/arvbox-demo$TAG
219 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$NPMCACHE" "$GOSTUFF" "$RLIBS"
222 if ! test -d "$ARVADOS_ROOT" ; then
223 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
225 if ! test -d "$SSO_ROOT" ; then
226 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
228 if ! test -d "$COMPOSER_ROOT" ; then
229 git clone https://github.com/curoverse/composer.git "$COMPOSER_ROOT"
231 if ! test -d "$WORKBENCH2_ROOT" ; then
232 git clone https://github.com/curoverse/arvados-workbench2.git "$WORKBENCH2_ROOT"
235 if test "$CONFIG" = test ; then
237 mkdir -p $VAR_DATA/test
239 if test "$need_setup" = 1 ; then
242 --name=$ARVBOX_CONTAINER \
244 "--env=SVDIR=/etc/test-service" \
245 arvados/arvbox-dev$TAG
249 /usr/local/lib/arvbox/runsu.sh \
250 /usr/local/lib/arvbox/waitforpostgres.sh
254 /usr/local/lib/arvbox/runsu.sh \
255 /var/lib/arvbox/service/sso/run-service --only-setup
259 /usr/local/lib/arvbox/runsu.sh \
260 /var/lib/arvbox/service/api/run-service --only-setup
265 /usr/local/lib/arvbox/runsu.sh \
266 /usr/src/arvados/build/run-tests.sh \
267 --temp /var/lib/arvados/test \
268 WORKSPACE=/usr/src/arvados \
269 GEM_HOME=/var/lib/gems \
271 elif echo "$CONFIG" | grep 'dev$' ; then
274 --name=$ARVBOX_CONTAINER \
277 arvados/arvbox-dev$TAG
280 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
281 echo "The Arvados testing root certificate is $VAR_DATA/root-cert.pem"
283 echo "Unknown configuration '$CONFIG'"
294 if test $(echo $TAG | cut -c1-1) != '-' ; then
302 if echo "$CONFIG" | grep 'demo$' ; then
303 docker pull arvados/arvbox-demo$TAG
305 docker pull arvados/arvbox-dev$TAG
310 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
311 docker stop $ARVBOX_CONTAINER
314 VOLUMES=--volumes=true
315 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
316 docker rm $VOLUMES $ARVBOX_CONTAINER
318 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
319 docker rm $VOLUMES $ARVBOX_CONTAINER
324 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
325 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
328 if docker --version |grep " 1\.[0-9]\." ; then
329 # Docker version prior 1.10 require -f flag
330 # -f flag removed in Docker 1.12
333 GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
334 docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
335 docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest
336 if test "$1" = localdemo -o "$1" = publicdemo ; then
337 docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
338 docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
340 docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
341 docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
347 localdemo|publicdemo|dev|publicdev|test)
351 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
358 if test -n "$subcmd" ; then
369 NO_CACHE=--no-cache build $@
378 exec docker exec -ti \
379 -e LINES=$(tput lines) \
380 -e COLUMNS=$(tput cols) \
382 -e GEM_HOME=/var/lib/gems \
383 $ARVBOX_CONTAINER /bin/bash
387 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
423 exec xdg-open http://$(gethost)
427 echo "Container: $ARVBOX_CONTAINER"
428 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
429 echo "Cluster id: $(getclusterid)"
430 echo "Status: running"
431 echo "Container IP: $(getip)"
432 echo "Published host: $(gethost)"
434 echo "Status: not running"
436 if test -d "$ARVBOX_DATA" ; then
437 echo "Data: $ARVBOX_DATA"
438 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
439 echo "Data: $ARVBOX_CONTAINER-data"
447 if test -d "$ARVBOX_DATA" ; then
448 if test "$subcmd" = destroy ; then
449 if test "$1" != -f ; then
450 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
451 echo "Use destroy -f if you really mean it."
455 rm -rf "$ARVBOX_DATA"
457 if test "$1" != -f ; then
458 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
459 echo "Code and downloaded packages will be preserved."
460 echo "Use reset -f if you really mean it."
464 rm -rf "$ARVBOX_DATA/postgres"
465 rm -rf "$ARVBOX_DATA/var"
468 if test "$1" != -f ; then
469 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
473 docker rm "$ARVBOX_CONTAINER-data"
478 if test -n "$1" ; then
479 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"
481 exec docker exec -ti $ARVBOX_CONTAINER tail $(docker exec -ti $ARVBOX_CONTAINER find -L /etc -path '/etc/service/*/log/main/current' -printf " %p")
486 if test -n "$1" ; then
487 exec docker exec $ARVBOX_CONTAINER cat "$@"
489 echo "Usage: $0 $subcmd <files>"
494 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
498 if test -n "$1" -a -n "$2" ; then
499 exec docker exec $ARVBOX_CONTAINER sv "$@"
501 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
502 echo "Available services:"
503 exec docker execa $ARVBOX_CONTAINER ls /etc/service
508 if test -n "$2" ; then
509 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
510 echo "Created new arvbox $2"
511 echo "export ARVBOX_CONTAINER=$2"
513 echo "clone <from> <to> clone an arvbox"
514 echo "available arvboxes: $(ls $ARVBOX_BASE)"
519 CERT=$PWD/${ARVBOX_CONTAINER}-root-cert.pem
520 if test -n "$1" ; then
523 docker exec $ARVBOX_CONTAINER cat /var/lib/arvados/root-cert.pem > "$CERT"
524 echo "Certificate copied to $CERT"
529 if docker ps -a --filter "status=exited" | grep -E "${ARVBOX_CONTAINER}-devenv$" -q ; then
530 docker start ${ARVBOX_CONTAINER}-devenv
531 elif ! (docker ps -a --filter "status=running" | grep -E "${ARVBOX_CONTAINER}-devenv$" -q) ; then
534 --name=${ARVBOX_CONTAINER}-devenv \
535 "--env=SVDIR=/etc/devenv-service" \
536 "--volume=$HOME:$HOME:rw" \
537 --volume=/tmp/.X11-unix:/tmp/.X11-unix:rw \
538 arvados/arvbox-dev$TAG
541 exec docker exec --interactive --tty \
542 -e LINES=$(tput lines) \
543 -e COLUMNS=$(tput cols) \
545 -e "ARVBOX_HOME=$HOME" \
546 -e "DISPLAY=$DISPLAY" \
548 ${ARVBOX_CONTAINER}-devenv \
549 /usr/local/lib/arvbox/devenv.sh "$@"
553 docker stop ${ARVBOX_CONTAINER}-devenv
557 docker stop ${ARVBOX_CONTAINER}-devenv
558 docker rm ${ARVBOX_CONTAINER}-devenv
562 echo "Arvados-in-a-box http://arvados.org"
564 echo "start|run <config> [tag] start $ARVBOX_CONTAINER container"
565 echo "stop stop arvbox container"
566 echo "restart <config> stop, then run again"
567 echo "status print some information about current arvbox"
568 echo "ip print arvbox docker container ip address"
569 echo "host print arvbox published host"
570 echo "shell enter arvbox shell"
571 echo "open open arvbox workbench in a web browser"
572 echo "root-cert get copy of root certificate"
573 echo "update <config> stop, pull latest image, run"
574 echo "build <config> build arvbox Docker image"
575 echo "reboot <config> stop, build arvbox Docker image, run"
576 echo "rebuild <config> build arvbox Docker image, no layer cache"
577 echo "reset delete arvbox arvados data (be careful!)"
578 echo "destroy delete all arvbox code and data (be careful!)"
579 echo "log <service> tail log of specified service"
580 echo "ls <options> list directories inside arvbox"
581 echo "cat <files> get contents of files inside arvbox"
582 echo "pipe run a bash script piped in from stdin"
583 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
584 echo "clone <from> <to> clone an arvbox"