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"
52 docker inspect $ARVBOX_CONTAINER | grep \"IPAddress\" | head -n1 | tr -d ' ":,\n' | cut -c10-
57 OVERRIDE=$(docker exec -i $ARVBOX_CONTAINER cat /var/run/localip_override 2>/dev/null)
60 if test "$CODE" = 0 ; then
68 if test -f ~/.config/arvados/$ARVBOX_CONTAINER.conf ; then
69 sed "s/ARVADOS_API_HOST=.*/ARVADOS_API_HOST=$(gethost):8000/" <$HOME/.config/arvados/$ARVBOX_CONTAINER.conf >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf.tmp
70 mv ~/.config/arvados/$ARVBOX_CONTAINER.conf.tmp ~/.config/arvados/$ARVBOX_CONTAINER.conf
72 mkdir -p $HOME/.config/arvados
73 cat >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf <<EOF
74 ARVADOS_API_HOST=$(gethost):8000
76 ARVADOS_API_HOST_INSECURE=true
82 FF=/tmp/arvbox-fifo-$$
84 docker logs -f $ARVBOX_CONTAINER > $FF &
88 if echo $line | grep "Workbench is running at" >/dev/null ; then
94 if test -n "$localip" ; then
95 echo "export ARVADOS_API_HOST=$localip:8000"
97 echo "export ARVADOS_API_HOST=$(gethost):8000"
102 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
103 echo "Container $ARVBOX_CONTAINER is already running, use stop, restart or rebuild"
107 if echo "$1" | grep '^public' ; then
108 if test -n "$ARVBOX_PUBLISH_IP" ; then
109 localip=$ARVBOX_PUBLISH_IP
111 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
112 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
115 echo $localip > $iptemp
117 PUBLIC="--volume=$iptemp:/var/run/localip_override
123 --publish=25100:25100
124 --publish=25107:25107
125 --publish=25108:25108
131 if echo "$1" | grep 'demo$' ; then
132 if test -d "$ARVBOX_DATA" ; then
133 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
134 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
138 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
139 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
144 --name=$ARVBOX_CONTAINER \
146 --volumes-from $ARVBOX_CONTAINER-data \
152 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS"
154 if ! test -d "$ARVADOS_ROOT" ; then
155 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
157 if ! test -d "$SSO_ROOT" ; then
158 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
161 if test "$1" = test ; then
164 mkdir -p $VAR_DATA/test
168 --name=$ARVBOX_CONTAINER \
170 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
171 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
172 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
173 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
174 "--volume=$PASSENGER:/var/lib/passenger:rw" \
175 "--volume=$GEMS:/var/lib/gems:rw" \
177 /usr/local/bin/runsvinit -svdir=/etc/test-service
181 /usr/local/lib/arvbox/runsu.sh \
182 /usr/local/lib/arvbox/waitforpostgres.sh
186 /usr/local/lib/arvbox/runsu.sh \
187 /var/lib/arvbox/service/sso/run-service --only-setup
191 /usr/local/lib/arvbox/runsu.sh \
192 /var/lib/arvbox/service/api/run-service --only-setup
196 /usr/local/lib/arvbox/runsu.sh \
197 /usr/src/arvados/build/run-tests.sh \
198 --temp /var/lib/arvados/test \
199 WORKSPACE=/usr/src/arvados \
200 GEM_HOME=/var/lib/gems \
202 elif echo "$1" | grep 'dev$' ; then
205 --name=$ARVBOX_CONTAINER \
207 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
208 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
209 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
210 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
211 "--volume=$PASSENGER:/var/lib/passenger:rw" \
212 "--volume=$GEMS:/var/lib/gems:rw" \
217 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
219 echo "Unknown configuration '$1'"
225 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
226 docker stop $ARVBOX_CONTAINER
229 VOLUMES=--volumes=true
230 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
231 docker rm $VOLUMES $ARVBOX_CONTAINER
233 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
234 docker rm $VOLUMES $ARVBOX_CONTAINER
239 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
240 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
243 docker build -t arvados/arvbox-base -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
244 if test "$1" = localdemo -o "$1" = publicdemo ; then
245 docker build -t arvados/arvbox-demo -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
247 docker build -t arvados/arvbox-dev -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
253 localdemo|publicdemo|dev|publicdev|test)
257 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
264 if test -n "$subcmd" ; then
279 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM GEM_HOME=/var/lib/gems /bin/bash
283 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
312 exec xdg-open http://$(gethost)
316 echo "Selected: $ARVBOX_CONTAINER"
317 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
318 echo "Status: running"
319 echo "Container IP: $(getip)"
320 echo "Published host: $(gethost)"
322 echo "Status: not running"
324 if test -d "$ARVBOX_DATA" ; then
325 echo "Data: $ARVBOX_DATA"
326 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
327 echo "Data: $ARVBOX_CONTAINER-data"
335 if test -d "$ARVBOX_DATA" ; then
336 if test "$subcmd" = destroy ; then
337 if test "$1" != -f ; then
338 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
339 echo "Use destroy -f if you really mean it."
343 rm -rf "$ARVBOX_DATA"
345 if test "$1" != -f ; then
346 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
347 echo "Code and downloaded packages will be preserved."
348 echo "Use reset -f if you really mean it."
352 rm -rf "$ARVBOX_DATA/postgres"
353 rm -rf "$ARVBOX_DATA/var"
356 if test "$1" != -f ; then
357 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
361 docker rm "$ARVBOX_CONTAINER-data"
366 if test -n "$1" ; then
367 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name +GF "/etc/service/$1/log/main/current"
369 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")
374 if test -n "$1" ; then
375 exec docker exec -ti $ARVBOX_CONTAINER cat "$@"
377 echo "Usage: $0 $subcmd <files>"
382 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
386 if test -n "$1" -a -n "$2" ; then
387 exec docker exec -ti $ARVBOX_CONTAINER sv "$@"
389 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
390 echo "Available services:"
391 exec docker exec -ti $ARVBOX_CONTAINER ls /etc/service
396 if test -n "$2" ; then
397 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
398 echo "Created new arvbox $2"
399 echo "export ARVBOX_CONTAINER=$2"
401 echo "clone <from> <to> clone an arvbox"
402 echo "available arvboxes: $(ls $ARVBOX_BASE)"
407 echo "Arvados-in-a-box http://arvados.org"
409 echo "$(basename $0) (build|start|run|open|shell|ip|stop|rebuild|reset|destroy|log|svrestart)"
411 echo "build <config> build arvbox Docker image"
412 echo "start|run <config> start $ARVBOX_CONTAINER container"
413 echo "open open arvbox workbench in a web browser"
414 echo "shell enter arvbox shell"
415 echo "ip print arvbox docker container ip address"
416 echo "host print arvbox published host"
417 echo "status print some information about current arvbox"
418 echo "stop stop arvbox container"
419 echo "restart <config> stop, then run again"
420 echo "rebuild <config> stop, build arvbox Docker image, run"
421 echo "reset delete arvbox arvados data (be careful!)"
422 echo "destroy delete all arvbox code and data (be careful!)"
423 echo "log <service> tail log of specified service"
424 echo "ls <options> list directories inside arvbox"
425 echo "cat <files> get contents of files inside arvbox"
426 echo "pipe run a bash script piped in from stdin"
427 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
428 echo "clone <from> <to> clone an arvbox"