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 &
107 if echo $line | grep "Workbench2 is running at" >/dev/null ; then
113 if test -n "$localip" ; then
114 echo "export ARVADOS_API_HOST=$localip:8000"
116 echo "export ARVADOS_API_HOST=$(gethost):8000"
128 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
129 if test "$CONFIG" = test ; then
132 echo "Container $ARVBOX_CONTAINER is already running"
137 if test $need_setup = 1 ; then
138 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
139 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or reboot"
146 if test $(echo $TAG | cut -c1-1) != '-' ; then
154 if echo "$CONFIG" | grep '^public' ; then
155 if test -n "$ARVBOX_PUBLISH_IP" ; then
156 localip=$ARVBOX_PUBLISH_IP
158 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
159 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
162 echo $localip > $iptemp
164 PUBLIC="--volume=$iptemp:/var/run/localip_override
171 --publish=25100:25100
172 --publish=25107:25107
173 --publish=25108:25108
180 if echo "$CONFIG" | grep 'demo$' ; then
181 if test -d "$ARVBOX_DATA" ; then
182 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
183 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
187 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
188 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
193 --name=$ARVBOX_CONTAINER \
195 --volumes-from $ARVBOX_CONTAINER-data \
197 arvados/arvbox-demo$TAG
201 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$NPMCACHE" "$GOSTUFF" "$RLIBS"
204 if ! test -d "$ARVADOS_ROOT" ; then
205 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
207 if ! test -d "$SSO_ROOT" ; then
208 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
210 if ! test -d "$COMPOSER_ROOT" ; then
211 git clone https://github.com/curoverse/composer.git "$COMPOSER_ROOT"
213 if ! test -d "$WORKBENCH2_ROOT" ; then
214 git clone https://github.com/curoverse/arvados-workbench2.git "$WORKBENCH2_ROOT"
217 if test "$CONFIG" = test ; then
219 mkdir -p $VAR_DATA/test
221 if test "$need_setup" = 1 ; then
224 --name=$ARVBOX_CONTAINER \
226 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
227 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
228 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
229 "--volume=$WORKBENCH2_ROOT:/usr/src/workbench2:rw" \
230 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
231 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
232 "--volume=$PASSENGER:/var/lib/passenger:rw" \
233 "--volume=$GEMS:/var/lib/gems:rw" \
234 "--volume=$PIPCACHE:/var/lib/pip:rw" \
235 "--volume=$NPMCACHE:/var/lib/npm:rw" \
236 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
237 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
238 "--env=SVDIR=/etc/test-service" \
239 arvados/arvbox-dev$TAG
243 /usr/local/lib/arvbox/runsu.sh \
244 /usr/local/lib/arvbox/waitforpostgres.sh
248 /usr/local/lib/arvbox/runsu.sh \
249 /var/lib/arvbox/service/sso/run-service --only-setup
253 /usr/local/lib/arvbox/runsu.sh \
254 /var/lib/arvbox/service/api/run-service --only-setup
259 /usr/local/lib/arvbox/runsu.sh \
260 /usr/src/arvados/build/run-tests.sh \
261 --temp /var/lib/arvados/test \
262 WORKSPACE=/usr/src/arvados \
263 GEM_HOME=/var/lib/gems \
265 elif echo "$CONFIG" | grep 'dev$' ; then
268 --name=$ARVBOX_CONTAINER \
270 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
271 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
272 "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \
273 "--volume=$WORKBENCH2_ROOT:/usr/src/workbench2:rw" \
274 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
275 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
276 "--volume=$PASSENGER:/var/lib/passenger:rw" \
277 "--volume=$GEMS:/var/lib/gems:rw" \
278 "--volume=$PIPCACHE:/var/lib/pip:rw" \
279 "--volume=$NPMCACHE:/var/lib/npm:rw" \
280 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
281 "--volume=$RLIBS:/var/lib/Rlibs:rw" \
283 arvados/arvbox-dev$TAG
286 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
287 echo "The Arvados testing root certificate is $VAR_DATA/root-cert.pem"
289 echo "Unknown configuration '$CONFIG'"
295 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
296 docker stop $ARVBOX_CONTAINER
299 VOLUMES=--volumes=true
300 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
301 docker rm $VOLUMES $ARVBOX_CONTAINER
303 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
304 docker rm $VOLUMES $ARVBOX_CONTAINER
309 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
310 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
313 if docker --version |grep " 1\.[0-9]\." ; then
314 # Docker version prior 1.10 require -f flag
315 # -f flag removed in Docker 1.12
318 GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
319 docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
320 docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest
321 if test "$1" = localdemo -o "$1" = publicdemo ; then
322 docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
323 docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
325 docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
326 docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
332 localdemo|publicdemo|dev|publicdev|test)
336 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
343 if test -n "$subcmd" ; then
354 NO_CACHE=--no-cache build $@
363 exec docker exec -ti -e LINES=$(tput lines) -e COLUMNS=$(tput cols) -e TERM=$TERM -e GEM_HOME=/var/lib/gems $ARVBOX_CONTAINER /bin/bash
367 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
396 exec xdg-open http://$(gethost)
400 echo "Container: $ARVBOX_CONTAINER"
401 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
402 echo "Cluster id: $(getclusterid)"
403 echo "Status: running"
404 echo "Container IP: $(getip)"
405 echo "Published host: $(gethost)"
407 echo "Status: not running"
409 if test -d "$ARVBOX_DATA" ; then
410 echo "Data: $ARVBOX_DATA"
411 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
412 echo "Data: $ARVBOX_CONTAINER-data"
420 if test -d "$ARVBOX_DATA" ; then
421 if test "$subcmd" = destroy ; then
422 if test "$1" != -f ; then
423 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
424 echo "Use destroy -f if you really mean it."
428 rm -rf "$ARVBOX_DATA"
430 if test "$1" != -f ; then
431 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
432 echo "Code and downloaded packages will be preserved."
433 echo "Use reset -f if you really mean it."
437 rm -rf "$ARVBOX_DATA/postgres"
438 rm -rf "$ARVBOX_DATA/var"
441 if test "$1" != -f ; then
442 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
446 docker rm "$ARVBOX_CONTAINER-data"
451 if test -n "$1" ; then
452 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"
454 exec docker exec -ti $ARVBOX_CONTAINER tail $(docker exec -ti $ARVBOX_CONTAINER find -L /etc -path '/etc/service/*/log/main/current' -printf " %p")
459 if test -n "$1" ; then
460 exec docker exec $ARVBOX_CONTAINER cat "$@"
462 echo "Usage: $0 $subcmd <files>"
467 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
471 if test -n "$1" -a -n "$2" ; then
472 exec docker exec $ARVBOX_CONTAINER sv "$@"
474 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
475 echo "Available services:"
476 exec docker execa $ARVBOX_CONTAINER ls /etc/service
481 if test -n "$2" ; then
482 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
483 echo "Created new arvbox $2"
484 echo "export ARVBOX_CONTAINER=$2"
486 echo "clone <from> <to> clone an arvbox"
487 echo "available arvboxes: $(ls $ARVBOX_BASE)"
492 echo "Arvados-in-a-box http://arvados.org"
494 echo "build <config> build arvbox Docker image"
495 echo "rebuild <config> build arvbox Docker image, no layer cache"
496 echo "start|run <config> [tag] start $ARVBOX_CONTAINER container"
497 echo "open open arvbox workbench in a web browser"
498 echo "shell enter arvbox shell"
499 echo "ip print arvbox docker container ip address"
500 echo "host print arvbox published host"
501 echo "status print some information about current arvbox"
502 echo "stop stop arvbox container"
503 echo "restart <config> stop, then run again"
504 echo "reboot <config> stop, build arvbox Docker image, run"
505 echo "reset delete arvbox arvados data (be careful!)"
506 echo "destroy delete all arvbox code and data (be careful!)"
507 echo "log <service> tail log of specified service"
508 echo "ls <options> list directories inside arvbox"
509 echo "cat <files> get contents of files inside arvbox"
510 echo "pipe run a bash script piped in from stdin"
511 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
512 echo "clone <from> <to> clone an arvbox"