5 if ! test -d /sys/fs/cgroup ; then
6 echo "Arvbox requires cgroups to be mounted at /sys/fs/cgroup in order to use"
7 echo "Docker-in-Docker. Older operating systems that put cgroups in other"
8 echo "places (such as /cgroup) are not supported."
12 if ! which docker >/dev/null 2>/dev/null ; then
13 echo "Arvbox requires Docker. To install, run the following command as root:"
14 echo "curl -sSL https://get.docker.com/ | sh"
18 if test -z "$ARVBOX_DOCKER" ; then
19 if which greadlink >/dev/null 2>/dev/null ; then
20 ARVBOX_DOCKER=$(greadlink -f $(dirname $0)/../lib/arvbox/docker)
22 ARVBOX_DOCKER=$(readlink -f $(dirname $0)/../lib/arvbox/docker)
26 if test -z "$ARVBOX_CONTAINER" ; then
27 ARVBOX_CONTAINER=arvbox
30 if test -z "$ARVBOX_BASE" ; then
31 ARVBOX_BASE="$HOME/.arvbox"
34 if test -z "$ARVBOX_DATA" ; then
35 ARVBOX_DATA="$ARVBOX_BASE/$ARVBOX_CONTAINER"
38 if test -z "$ARVADOS_ROOT" ; then
39 ARVADOS_ROOT="$ARVBOX_DATA/arvados"
42 if test -z "$SSO_ROOT" ; then
43 SSO_ROOT="$ARVBOX_DATA/sso-devise-omniauth-provider"
46 PG_DATA="$ARVBOX_DATA/postgres"
47 VAR_DATA="$ARVBOX_DATA/var"
48 PASSENGER="$ARVBOX_DATA/passenger"
49 GEMS="$ARVBOX_DATA/gems"
50 PIPCACHE="$ARVBOX_DATA/pip"
51 GOSTUFF="$ARVBOX_DATA/gopath"
54 docker inspect $ARVBOX_CONTAINER | grep \"IPAddress\" | head -n1 | tr -d ' ":,\n' | cut -c10-
59 OVERRIDE=$(docker exec -i $ARVBOX_CONTAINER cat /var/run/localip_override 2>/dev/null)
62 if test "$CODE" = 0 ; then
70 if test -f ~/.config/arvados/$ARVBOX_CONTAINER.conf ; then
71 sed "s/ARVADOS_API_HOST=.*/ARVADOS_API_HOST=$(gethost):8000/" <$HOME/.config/arvados/$ARVBOX_CONTAINER.conf >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf.tmp
72 mv ~/.config/arvados/$ARVBOX_CONTAINER.conf.tmp ~/.config/arvados/$ARVBOX_CONTAINER.conf
74 mkdir -p $HOME/.config/arvados
75 cat >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf <<EOF
76 ARVADOS_API_HOST=$(gethost):8000
78 ARVADOS_API_HOST_INSECURE=true
84 FF=/tmp/arvbox-fifo-$$
86 docker logs -f $ARVBOX_CONTAINER > $FF &
90 if echo $line | grep "Workbench is running at" >/dev/null ; then
96 if test -n "$localip" ; then
97 echo "export ARVADOS_API_HOST=$localip:8000"
99 echo "export ARVADOS_API_HOST=$(gethost):8000"
104 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
105 echo "Container $ARVBOX_CONTAINER is already running"
109 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
110 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or rebuild"
114 if echo "$1" | grep '^public' ; then
115 if test -n "$ARVBOX_PUBLISH_IP" ; then
116 localip=$ARVBOX_PUBLISH_IP
118 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
119 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
122 echo $localip > $iptemp
124 PUBLIC="--volume=$iptemp:/var/run/localip_override
130 --publish=25100:25100
131 --publish=25107:25107
132 --publish=25108:25108
139 if echo "$1" | grep 'demo$' ; then
140 if test -d "$ARVBOX_DATA" ; then
141 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
142 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
146 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
147 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
152 --name=$ARVBOX_CONTAINER \
154 --volumes-from $ARVBOX_CONTAINER-data \
160 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$GOSTUFF"
163 if ! test -d "$ARVADOS_ROOT" ; then
164 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
166 if ! test -d "$SSO_ROOT" ; then
167 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
170 if test "$1" = test ; then
173 mkdir -p $VAR_DATA/test
177 --name=$ARVBOX_CONTAINER \
179 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
180 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
181 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
182 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
183 "--volume=$PASSENGER:/var/lib/passenger:rw" \
184 "--volume=$GEMS:/var/lib/gems:rw" \
185 "--volume=$PIPCACHE:/var/lib/pip:rw" \
186 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
188 /usr/local/bin/runsvinit -svdir=/etc/test-service
192 /usr/local/lib/arvbox/runsu.sh \
193 /usr/local/lib/arvbox/waitforpostgres.sh
197 /usr/local/lib/arvbox/runsu.sh \
198 /var/lib/arvbox/service/sso/run-service --only-setup
202 /usr/local/lib/arvbox/runsu.sh \
203 /var/lib/arvbox/service/api/run-service --only-setup
207 /usr/local/lib/arvbox/runsu.sh \
208 /usr/src/arvados/build/run-tests.sh \
209 --temp /var/lib/arvados/test \
210 WORKSPACE=/usr/src/arvados \
211 GEM_HOME=/var/lib/gems \
213 elif echo "$1" | grep 'dev$' ; then
216 --name=$ARVBOX_CONTAINER \
218 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
219 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
220 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
221 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
222 "--volume=$PASSENGER:/var/lib/passenger:rw" \
223 "--volume=$GEMS:/var/lib/gems:rw" \
224 "--volume=$PIPCACHE:/var/lib/pip:rw" \
225 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
230 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
232 echo "Unknown configuration '$1'"
238 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
239 docker stop $ARVBOX_CONTAINER
242 VOLUMES=--volumes=true
243 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
244 docker rm $VOLUMES $ARVBOX_CONTAINER
246 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
247 docker rm $VOLUMES $ARVBOX_CONTAINER
252 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
253 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
256 docker build $NO_CACHE -t arvados/arvbox-base -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
257 if test "$1" = localdemo -o "$1" = publicdemo ; then
258 docker build $NO_CACHE -t arvados/arvbox-demo -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
260 docker build $NO_CACHE -t arvados/arvbox-dev -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
266 localdemo|publicdemo|dev|publicdev|test)
270 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
277 if test -n "$subcmd" ; then
288 NO_CACHE=--no-cache build $@
297 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM GEM_HOME=/var/lib/gems /bin/bash
301 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
330 exec xdg-open http://$(gethost)
334 echo "Selected: $ARVBOX_CONTAINER"
335 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
336 echo "Status: running"
337 echo "Container IP: $(getip)"
338 echo "Published host: $(gethost)"
340 echo "Status: not running"
342 if test -d "$ARVBOX_DATA" ; then
343 echo "Data: $ARVBOX_DATA"
344 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
345 echo "Data: $ARVBOX_CONTAINER-data"
353 if test -d "$ARVBOX_DATA" ; then
354 if test "$subcmd" = destroy ; then
355 if test "$1" != -f ; then
356 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
357 echo "Use destroy -f if you really mean it."
361 rm -rf "$ARVBOX_DATA"
363 if test "$1" != -f ; then
364 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
365 echo "Code and downloaded packages will be preserved."
366 echo "Use reset -f if you really mean it."
370 rm -rf "$ARVBOX_DATA/postgres"
371 rm -rf "$ARVBOX_DATA/var"
374 if test "$1" != -f ; then
375 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
379 docker rm "$ARVBOX_CONTAINER-data"
384 if test -n "$1" ; then
385 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name -R +GF "/etc/service/$1/log/main/current"
387 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")
392 if test -n "$1" ; then
393 exec docker exec -ti $ARVBOX_CONTAINER cat "$@"
395 echo "Usage: $0 $subcmd <files>"
400 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
404 if test -n "$1" -a -n "$2" ; then
405 exec docker exec -ti $ARVBOX_CONTAINER sv "$@"
407 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
408 echo "Available services:"
409 exec docker exec -ti $ARVBOX_CONTAINER ls /etc/service
414 if test -n "$2" ; then
415 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
416 echo "Created new arvbox $2"
417 echo "export ARVBOX_CONTAINER=$2"
419 echo "clone <from> <to> clone an arvbox"
420 echo "available arvboxes: $(ls $ARVBOX_BASE)"
425 echo "Arvados-in-a-box http://arvados.org"
427 echo "build <config> build arvbox Docker image"
428 echo "rebuild <config> build arvbox Docker image, no layer cache"
429 echo "start|run <config> start $ARVBOX_CONTAINER container"
430 echo "open open arvbox workbench in a web browser"
431 echo "shell enter arvbox shell"
432 echo "ip print arvbox docker container ip address"
433 echo "host print arvbox published host"
434 echo "status print some information about current arvbox"
435 echo "stop stop arvbox container"
436 echo "restart <config> stop, then run again"
437 echo "reboot <config> stop, build arvbox Docker image, run"
438 echo "reset delete arvbox arvados data (be careful!)"
439 echo "destroy delete all arvbox code and data (be careful!)"
440 echo "log <service> tail log of specified service"
441 echo "ls <options> list directories inside arvbox"
442 echo "cat <files> get contents of files inside arvbox"
443 echo "pipe run a bash script piped in from stdin"
444 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
445 echo "clone <from> <to> clone an arvbox"