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"
109 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
110 echo "Container $ARVBOX_CONTAINER is already running"
114 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
115 echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or rebuild"
121 if test $(echo $TAG | cut -c1-1) != '-' ; then
129 if echo "$CONFIG" | grep '^public' ; then
130 if test -n "$ARVBOX_PUBLISH_IP" ; then
131 localip=$ARVBOX_PUBLISH_IP
133 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
134 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
137 echo $localip > $iptemp
139 PUBLIC="--volume=$iptemp:/var/run/localip_override
145 --publish=25100:25100
146 --publish=25107:25107
147 --publish=25108:25108
154 if echo "$CONFIG" | grep 'demo$' ; then
155 if test -d "$ARVBOX_DATA" ; then
156 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
157 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
161 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
162 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
167 --name=$ARVBOX_CONTAINER \
169 --volumes-from $ARVBOX_CONTAINER-data \
171 arvados/arvbox-demo$TAG
175 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$GOSTUFF"
178 if ! test -d "$ARVADOS_ROOT" ; then
179 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
181 if ! test -d "$SSO_ROOT" ; then
182 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
185 if test "$CONFIG" = test ; then
187 mkdir -p $VAR_DATA/test
191 --name=$ARVBOX_CONTAINER \
193 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
194 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
195 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
196 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
197 "--volume=$PASSENGER:/var/lib/passenger:rw" \
198 "--volume=$GEMS:/var/lib/gems:rw" \
199 "--volume=$PIPCACHE:/var/lib/pip:rw" \
200 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
201 arvados/arvbox-dev$TAG \
202 /usr/local/bin/runsvinit -svdir=/etc/test-service
206 /usr/local/lib/arvbox/runsu.sh \
207 /usr/local/lib/arvbox/waitforpostgres.sh
211 /usr/local/lib/arvbox/runsu.sh \
212 /var/lib/arvbox/service/sso/run-service --only-setup
216 /usr/local/lib/arvbox/runsu.sh \
217 /var/lib/arvbox/service/api/run-service --only-setup
221 /usr/local/lib/arvbox/runsu.sh \
222 /usr/src/arvados/build/run-tests.sh \
223 --temp /var/lib/arvados/test \
224 WORKSPACE=/usr/src/arvados \
225 GEM_HOME=/var/lib/gems \
227 elif echo "$CONFIG" | grep 'dev$' ; then
230 --name=$ARVBOX_CONTAINER \
232 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
233 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
234 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
235 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
236 "--volume=$PASSENGER:/var/lib/passenger:rw" \
237 "--volume=$GEMS:/var/lib/gems:rw" \
238 "--volume=$PIPCACHE:/var/lib/pip:rw" \
239 "--volume=$GOSTUFF:/var/lib/gopath:rw" \
241 arvados/arvbox-dev$TAG
244 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
246 echo "Unknown configuration '$CONFIG'"
252 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
253 docker stop $ARVBOX_CONTAINER
256 VOLUMES=--volumes=true
257 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
258 docker rm $VOLUMES $ARVBOX_CONTAINER
260 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
261 docker rm $VOLUMES $ARVBOX_CONTAINER
266 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
267 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
270 GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
271 docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
272 if docker --version |grep " 1\.[0-9]\." ; then
273 # Docker version prior 1.10 require -f flag
274 # -f flag removed in Docker 1.12
277 if test "$1" = localdemo -o "$1" = publicdemo ; then
278 docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
279 docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
281 docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
282 docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
288 localdemo|publicdemo|dev|publicdev|test)
292 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
299 if test -n "$subcmd" ; then
310 NO_CACHE=--no-cache build $@
319 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM GEM_HOME=/var/lib/gems /bin/bash
323 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
352 exec xdg-open http://$(gethost)
356 echo "Selected: $ARVBOX_CONTAINER"
357 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
358 echo "Status: running"
359 echo "Container IP: $(getip)"
360 echo "Published host: $(gethost)"
362 echo "Status: not running"
364 if test -d "$ARVBOX_DATA" ; then
365 echo "Data: $ARVBOX_DATA"
366 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
367 echo "Data: $ARVBOX_CONTAINER-data"
375 if test -d "$ARVBOX_DATA" ; then
376 if test "$subcmd" = destroy ; then
377 if test "$1" != -f ; then
378 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
379 echo "Use destroy -f if you really mean it."
383 rm -rf "$ARVBOX_DATA"
385 if test "$1" != -f ; then
386 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
387 echo "Code and downloaded packages will be preserved."
388 echo "Use reset -f if you really mean it."
392 rm -rf "$ARVBOX_DATA/postgres"
393 rm -rf "$ARVBOX_DATA/var"
396 if test "$1" != -f ; then
397 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
401 docker rm "$ARVBOX_CONTAINER-data"
406 if test -n "$1" ; then
407 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name -R +GF "/etc/service/$1/log/main/current"
409 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")
414 if test -n "$1" ; then
415 exec docker exec $ARVBOX_CONTAINER cat "$@"
417 echo "Usage: $0 $subcmd <files>"
422 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
426 if test -n "$1" -a -n "$2" ; then
427 exec docker exec -ti $ARVBOX_CONTAINER sv "$@"
429 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
430 echo "Available services:"
431 exec docker exec -ti $ARVBOX_CONTAINER ls /etc/service
436 if test -n "$2" ; then
437 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
438 echo "Created new arvbox $2"
439 echo "export ARVBOX_CONTAINER=$2"
441 echo "clone <from> <to> clone an arvbox"
442 echo "available arvboxes: $(ls $ARVBOX_BASE)"
447 echo "Arvados-in-a-box http://arvados.org"
449 echo "build <config> build arvbox Docker image"
450 echo "rebuild <config> build arvbox Docker image, no layer cache"
451 echo "start|run <config> [tag] start $ARVBOX_CONTAINER container"
452 echo "open open arvbox workbench in a web browser"
453 echo "shell enter arvbox shell"
454 echo "ip print arvbox docker container ip address"
455 echo "host print arvbox published host"
456 echo "status print some information about current arvbox"
457 echo "stop stop arvbox container"
458 echo "restart <config> stop, then run again"
459 echo "reboot <config> stop, build arvbox Docker image, run"
460 echo "reset delete arvbox arvados data (be careful!)"
461 echo "destroy delete all arvbox code and data (be careful!)"
462 echo "log <service> tail log of specified service"
463 echo "ls <options> list directories inside arvbox"
464 echo "cat <files> get contents of files inside arvbox"
465 echo "pipe run a bash script piped in from stdin"
466 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
467 echo "clone <from> <to> clone an arvbox"