10025: Rearrange arvbox layers for better caching. Embed build version to
[arvados.git] / tools / arvbox / bin / arvbox
index 2e46886681ac77b2edde0fd8694734a3cc209020..60917b5bd110004b151e27a0d82e6f45bcc14557 100755 (executable)
@@ -101,6 +101,9 @@ wait_for_arvbox() {
 }
 
 run() {
+    CONFIG=$1
+    TAG=$2
+
     if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
         echo "Container $ARVBOX_CONTAINER is already running"
         exit 0
@@ -111,7 +114,13 @@ run() {
         exit 1
     fi
 
-    if echo "$1" | grep '^public' ; then
+    if test ! -z "$TAG"
+    then
+        # XXX should push tag back onto argument list if it starts with '-'
+       TAG=":$TAG"
+    fi
+
+    if echo "$CONFIG" | grep '^public' ; then
         if test -n "$ARVBOX_PUBLISH_IP" ; then
             localip=$ARVBOX_PUBLISH_IP
         else
@@ -130,12 +139,13 @@ run() {
               --publish=25100:25100
               --publish=25107:25107
               --publish=25108:25108
-              --publish=8001:8001"
+              --publish=8001:8001
+              --publish=8002:8002"
     else
         PUBLIC=""
     fi
 
-    if echo "$1" | grep 'demo$' ; then
+    if echo "$CONFIG" | grep 'demo$' ; then
         if test -d "$ARVBOX_DATA" ; then
             echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
             echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
@@ -152,7 +162,7 @@ run() {
                --privileged \
                --volumes-from $ARVBOX_CONTAINER-data \
                $PUBLIC \
-               arvados/arvbox-demo
+               arvados/arvbox-demo$TAG
         updateconf
         wait_for_arvbox
     else
@@ -166,8 +176,7 @@ run() {
             git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
         fi
 
-        if test "$1" = test ; then
-            shift
+        if test "$CONFIG" = test ; then
 
             mkdir -p $VAR_DATA/test
 
@@ -183,7 +192,7 @@ run() {
                    "--volume=$GEMS:/var/lib/gems:rw" \
                    "--volume=$PIPCACHE:/var/lib/pip:rw" \
                    "--volume=$GOSTUFF:/var/lib/gopath:rw" \
-                   arvados/arvbox-dev \
+                   arvados/arvbox-dev$TAG \
                    /usr/local/bin/runsvinit -svdir=/etc/test-service
 
             docker exec -ti \
@@ -201,6 +210,7 @@ run() {
                    /usr/local/lib/arvbox/runsu.sh \
                    /var/lib/arvbox/service/api/run-service --only-setup
 
+            shift ; shift
             docker exec -ti \
                    $ARVBOX_CONTAINER \
                    /usr/local/lib/arvbox/runsu.sh \
@@ -209,7 +219,7 @@ run() {
                    WORKSPACE=/usr/src/arvados \
                    GEM_HOME=/var/lib/gems \
                    "$@"
-        elif echo "$1" | grep 'dev$' ; then
+        elif echo "$CONFIG" | grep 'dev$' ; then
             docker run \
                    --detach \
                    --name=$ARVBOX_CONTAINER \
@@ -223,12 +233,12 @@ run() {
                    "--volume=$PIPCACHE:/var/lib/pip:rw" \
                    "--volume=$GOSTUFF:/var/lib/gopath:rw" \
                    $PUBLIC \
-                   arvados/arvbox-dev
+                   arvados/arvbox-dev$TAG
             updateconf
             wait_for_arvbox
             echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
         else
-            echo "Unknown configuration '$1'"
+            echo "Unknown configuration '$CONFIG'"
         fi
     fi
 }
@@ -252,11 +262,14 @@ build() {
         echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
         exit 1
     fi
-    docker build $NO_CACHE -t arvados/arvbox-base -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
+    GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
+    docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
     if test "$1" = localdemo -o "$1" = publicdemo ; then
-        docker build $NO_CACHE -t arvados/arvbox-demo -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
+        docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
+        docker tag arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
     else
-        docker build $NO_CACHE -t arvados/arvbox-dev -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
+        docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
+        docker tag arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
     fi
 }
 
@@ -381,7 +394,7 @@ case "$subcmd" in
 
     log)
         if test -n "$1" ; then
-            exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name +GF "/etc/service/$1/log/main/current"
+            exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name -R +GF "/etc/service/$1/log/main/current"
         else
             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")
         fi
@@ -389,7 +402,7 @@ case "$subcmd" in
 
     cat)
         if test -n "$1" ; then
-            exec docker exec -ti $ARVBOX_CONTAINER cat "$@"
+            exec docker exec $ARVBOX_CONTAINER cat "$@"
         else
             echo "Usage: $0 $subcmd <files>"
         fi
@@ -425,7 +438,7 @@ case "$subcmd" in
         echo
         echo "build   <config>      build arvbox Docker image"
         echo "rebuild <config>      build arvbox Docker image, no layer cache"
-        echo "start|run <config>  start $ARVBOX_CONTAINER container"
+        echo "start|run <config> [tag]  start $ARVBOX_CONTAINER container"
         echo "open       open arvbox workbench in a web browser"
         echo "shell      enter arvbox shell"
         echo "ip         print arvbox docker container ip address"