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 PG_DATA="$ARVBOX_DATA/postgres"
50 VAR_DATA="$ARVBOX_DATA/var"
51 PASSENGER="$ARVBOX_DATA/passenger"
52 GEMS="$ARVBOX_DATA/gems"
53 PIPCACHE="$ARVBOX_DATA/pip"
54 GOSTUFF="$ARVBOX_DATA/gopath"
57 docker inspect $ARVBOX_CONTAINER | grep \"IPAddress\" | head -n1 | tr -d ' ":,\n' | cut -c10-
62 OVERRIDE=$(docker exec -i $ARVBOX_CONTAINER cat /var/run/localip_override 2>/dev/null)
65 if test "$CODE" = 0 ; then
73 if test -f ~/.config/arvados/$ARVBOX_CONTAINER.conf ; then
74 sed "s/ARVADOS_API_HOST=.*/ARVADOS_API_HOST=$(gethost):8000/" <$HOME/.config/arvados/$ARVBOX_CONTAINER.conf >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf.tmp
75 mv ~/.config/arvados/$ARVBOX_CONTAINER.conf.tmp ~/.config/arvados/$ARVBOX_CONTAINER.conf
77 mkdir -p $HOME/.config/arvados
78 cat >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf <<EOF
79 ARVADOS_API_HOST=$(gethost):8000
81 ARVADOS_API_HOST_INSECURE=true
87 FF=/tmp/arvbox-fifo-$$
89 docker logs -f $ARVBOX_CONTAINER > $FF &
93 if echo $line | grep "Workbench is running at" >/dev/null ; then
99 if test -n "$localip" ; then
100 echo "export ARVADOS_API_HOST=$localip:8000"
102 echo "export ARVADOS_API_HOST=$(gethost):8000"
114 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
115 if test "$CONFIG" = test ; then
118 echo "Container $ARVBOX_CONTAINER is already running"
123 if test $need_setup = 1 ; then
124 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
125 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or reboot"
132 if test $(echo $TAG | cut -c1-1) != '-' ; then
140 if echo "$CONFIG" | grep '^public' ; then
141 if test -n "$ARVBOX_PUBLISH_IP" ; then
142 localip=$ARVBOX_PUBLISH_IP
144 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
145 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
148 echo $localip > $iptemp
150 PUBLIC="--volume=$iptemp:/var/run/localip_override
156 --publish=25100:25100
157 --publish=25107:25107
158 --publish=25108:25108
165 if echo "$CONFIG" | grep 'demo$' ; then
166 if test -d "$ARVBOX_DATA" ; then
167 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
168 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
172 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
173 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
178 --name=$ARVBOX_CONTAINER \
180 --volumes-from $ARVBOX_CONTAINER-data \
182 arvados/arvbox-demo$TAG
186 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$GOSTUFF"
189 if ! test -d "$ARVADOS_ROOT" ; then
190 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
192 if ! test -d "$SSO_ROOT" ; then
193 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
196 if test "$CONFIG" = test ; then
198 mkdir -p $VAR_DATA/test
200 if test "$need_setup" = 1 ; then
203 --name=$ARVBOX_CONTAINER \
205 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
206 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
207 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
208 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
209 "--volume=$PASSENGER:/var/lib/passenger:rw" \
210 "--volume=$GEMS:/var/lib/gems:rw" \
211 "--volume=$PIPCACHE:/var/lib/pip:rw" \
212 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
213 arvados/arvbox-dev$TAG \
214 /usr/local/bin/runsvinit -svdir=/etc/test-service
218 /usr/local/lib/arvbox/runsu.sh \
219 /usr/local/lib/arvbox/waitforpostgres.sh
223 /usr/local/lib/arvbox/runsu.sh \
224 /var/lib/arvbox/service/sso/run-service --only-setup
228 /usr/local/lib/arvbox/runsu.sh \
229 /var/lib/arvbox/service/api/run-service --only-setup
234 /usr/local/lib/arvbox/runsu.sh \
235 /usr/src/arvados/build/run-tests.sh \
236 --temp /var/lib/arvados/test \
237 WORKSPACE=/usr/src/arvados \
238 GEM_HOME=/var/lib/gems \
240 elif echo "$CONFIG" | grep 'dev$' ; then
243 --name=$ARVBOX_CONTAINER \
245 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
246 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
247 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
248 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
249 "--volume=$PASSENGER:/var/lib/passenger:rw" \
250 "--volume=$GEMS:/var/lib/gems:rw" \
251 "--volume=$PIPCACHE:/var/lib/pip:rw" \
252 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
254 arvados/arvbox-dev$TAG
257 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
259 echo "Unknown configuration '$CONFIG'"
265 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
266 docker stop $ARVBOX_CONTAINER
269 VOLUMES=--volumes=true
270 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
271 docker rm $VOLUMES $ARVBOX_CONTAINER
273 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
274 docker rm $VOLUMES $ARVBOX_CONTAINER
279 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
280 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
283 if docker --version |grep " 1\.[0-9]\." ; then
284 # Docker version prior 1.10 require -f flag
285 # -f flag removed in Docker 1.12
288 GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
289 docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
290 docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest
291 if test "$1" = localdemo -o "$1" = publicdemo ; then
292 docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
293 docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
295 docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
296 docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
302 localdemo|publicdemo|dev|publicdev|test)
306 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
313 if test -n "$subcmd" ; then
324 NO_CACHE=--no-cache build $@
333 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM GEM_HOME=/var/lib/gems /bin/bash
337 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
366 exec xdg-open http://$(gethost)
370 echo "Selected: $ARVBOX_CONTAINER"
371 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
372 echo "Status: running"
373 echo "Container IP: $(getip)"
374 echo "Published host: $(gethost)"
376 echo "Status: not running"
378 if test -d "$ARVBOX_DATA" ; then
379 echo "Data: $ARVBOX_DATA"
380 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
381 echo "Data: $ARVBOX_CONTAINER-data"
389 if test -d "$ARVBOX_DATA" ; then
390 if test "$subcmd" = destroy ; then
391 if test "$1" != -f ; then
392 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
393 echo "Use destroy -f if you really mean it."
397 rm -rf "$ARVBOX_DATA"
399 if test "$1" != -f ; then
400 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
401 echo "Code and downloaded packages will be preserved."
402 echo "Use reset -f if you really mean it."
406 rm -rf "$ARVBOX_DATA/postgres"
407 rm -rf "$ARVBOX_DATA/var"
410 if test "$1" != -f ; then
411 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
415 docker rm "$ARVBOX_CONTAINER-data"
420 if test -n "$1" ; then
421 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name -R +GF "/etc/service/$1/log/main/current"
423 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")
428 if test -n "$1" ; then
429 exec docker exec $ARVBOX_CONTAINER cat "$@"
431 echo "Usage: $0 $subcmd <files>"
436 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
440 if test -n "$1" -a -n "$2" ; then
441 exec docker exec -ti $ARVBOX_CONTAINER sv "$@"
443 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
444 echo "Available services:"
445 exec docker exec -ti $ARVBOX_CONTAINER ls /etc/service
450 if test -n "$2" ; then
451 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
452 echo "Created new arvbox $2"
453 echo "export ARVBOX_CONTAINER=$2"
455 echo "clone <from> <to> clone an arvbox"
456 echo "available arvboxes: $(ls $ARVBOX_BASE)"
461 echo "Arvados-in-a-box http://arvados.org"
463 echo "build <config> build arvbox Docker image"
464 echo "rebuild <config> build arvbox Docker image, no layer cache"
465 echo "start|run <config> [tag] start $ARVBOX_CONTAINER container"
466 echo "open open arvbox workbench in a web browser"
467 echo "shell enter arvbox shell"
468 echo "ip print arvbox docker container ip address"
469 echo "host print arvbox published host"
470 echo "status print some information about current arvbox"
471 echo "stop stop arvbox container"
472 echo "restart <config> stop, then run again"
473 echo "reboot <config> stop, build arvbox Docker image, run"
474 echo "reset delete arvbox arvados data (be careful!)"
475 echo "destroy delete all arvbox code and data (be careful!)"
476 echo "log <service> tail log of specified service"
477 echo "ls <options> list directories inside arvbox"
478 echo "cat <files> get contents of files inside arvbox"
479 echo "pipe run a bash script piped in from stdin"
480 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
481 echo "clone <from> <to> clone an arvbox"