diff --git a/scripts/Dockerfile b/scripts/Dockerfile
index f2e750710b69b3441a649fb02567a4a6ce271e86..6d00d5ead35eef20f5ca945605c002445e4e047d 100644
--- a/scripts/Dockerfile
+++ b/scripts/Dockerfile
@@ -2,8 +2,32 @@
 # applications for cozy-stack. It installs couchdb 2 and the cozy-stack.
 # It should not be used for hosting your cozy cloud in production.
 
+
+# Multi-stage image: this step builds cozy-stack
+FROM golang:1.11 as build
+WORKDIR /go/src/github.com/cozy/cozy-stack
+
+# MailHog
+ENV MAILHOG_VERSION 1.0.0
+ENV MAILHOG_SRC_URL https://github.com/mailhog/MailHog/releases/download/v$MAILHOG_VERSION/MailHog_linux_amd64
+ENV MAILHOG_SRC_SHA256 ba921e04438e176c474d533447ae64707ffcdd1230f0153f86cb188d348f25c0
+RUN set -eu; curl -fsSL "$MAILHOG_SRC_URL" -o MailHog \
+  && echo "$MAILHOG_SRC_SHA256  MailHog" | sha256sum -c - \
+  && chmod +x MailHog
+
+# Build cozy-stack
+COPY . .
+RUN go get -d -v ./...
+RUN ./scripts/build.sh dev
+
+
+# Multi-stage image: the main image
 FROM debian:stretch-slim
 
+# cozy-stack
+ENV COZY_STACK_HOST cozy.tools
+ENV COZY_STACK_PORT 8080
+ENV COZY_STACK_PATH cozy-stack
 
 # CouchDB
 ENV COUCHDB_VERSION 2.3.0
@@ -12,7 +36,8 @@ ENV COUCHDB_SRC_SHA256 0b3868d042b158d9fd2f504804abd93cd22681c033952f832ce846672
 
 ARG DEBIAN_FRONTEND=noninteractive
 
-RUN apt-get update && apt-get install -y --no-install-recommends \
+RUN set -eux; apt-get update \
+  && apt-get install -y --no-install-recommends \
     build-essential \
     ca-certificates \
     curl \
@@ -48,31 +73,16 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
   && printf "[chttpd]\\nbind_address = 0.0.0.0\\n" \
     > /usr/local/couchdb/etc/local.ini \
   && apt-get autoremove -y && apt-get clean \
-  && apt-get install -y libicu57 --no-install-recommends
+  && mkdir -p /data/cozy-app && mkdir -p /data/cozy-storage
 
 ENV PATH $PATH:/usr/local/couchdb/bin
 
-# MailHog
-ENV MAILHOG_VERSION 1.0.0
-ENV MAILHOG_SRC_URL https://github.com/mailhog/MailHog/releases/download/v$MAILHOG_VERSION/MailHog_linux_amd64
-ENV MAILHOG_SRC_SHA256 ba921e04438e176c474d533447ae64707ffcdd1230f0153f86cb188d348f25c0
-
-RUN curl -fsSL "$MAILHOG_SRC_URL" -o /usr/bin/MailHog \
-  && echo "$MAILHOG_SRC_SHA256  /usr/bin/MailHog" | sha256sum -c -
-
-# cozy-stack
-ENV COZY_STACK_HOST cozy.tools
-ENV COZY_STACK_PORT 8080
-ENV COZY_STACK_PATH cozy-stack
-
-COPY ./docker-entrypoint.sh /
-COPY ./cozy-app-dev.sh ./cozy-stack /usr/bin/
-
-RUN chmod +x /docker-entrypoint.sh \
-              /usr/bin/cozy-app-dev.sh \
-              /usr/bin/cozy-stack \
-              /usr/bin/MailHog \
-  && mkdir -p /data/cozy-app && mkdir -p /data/cozy-storage
+COPY --from=build \
+  /go/src/github.com/cozy/cozy-stack/cozy-stack \
+  /go/src/github.com/cozy/cozy-stack/scripts/docker-entrypoint.sh \
+  /go/src/github.com/cozy/cozy-stack/scripts/cozy-app-dev.sh \
+  /go/src/github.com/cozy/cozy-stack/MailHog \
+  /usr/bin/
 
-EXPOSE 8080 8025 5984
-ENTRYPOINT ["/docker-entrypoint.sh"]
+EXPOSE 8080 6060 8025 5984
+ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
diff --git a/scripts/build.sh b/scripts/build.sh
index d642564e1216cb6aeeadae6b07fcdf8b85d92c5b..0f17f7de234a948e42ff1a4fbacc55de043f46e1 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -38,36 +38,6 @@ usage() {
 	echo -e "    can be \"production\" or \"development\". default: \"${COZY_ENV_DFL}\""
 }
 
-do_prepare_ldflags() {
-	eval "$(go env)"
-
-	VERSION_OS_ARCH="${GOOS}-${GOARCH}"
-	if [ -z "${VERSION_STRING}" ]; then
-		VERSION_STRING=$(git -C "${WORK_DIR}" --work-tree="${WORK_DIR}" \
-			describe --tags --dirty 2> /dev/null)
-
-		if [ -z "${VERSION_STRING}" ]; then
-			VERSION_STRING="v0-$(git -C "${WORK_DIR}" rev-parse --short HEAD)"
-			echo_wrn "No tag has been found to version the stack, using \"${VERSION_STRING}\" as version number"
-		fi
-
-		if ! git -C "${WORK_DIR}" diff --exit-code HEAD &>/dev/null; then
-			if [ "${COZY_ENV}" == "production" ]; then
-				echo_err "Can not build a production release in a dirty work-tree"
-				exit 1
-			fi
-			VERSION_STRING="${VERSION_STRING}-dirty"
-		fi
-
-		if [ "${COZY_ENV}" == "development" ]; then
-			VERSION_STRING="${VERSION_STRING}-dev"
-		fi
-	fi
-
-	BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
-	BUILD_MODE="${COZY_ENV}"
-}
-
 # The version string is deterministic and reflects entirely the state
 # of the working-directory from which the release is built from. It is
 # generated using the following format:
@@ -90,18 +60,16 @@ do_prepare_ldflags() {
 # SHA256 checksum of the binary is also generated in a file named
 # "cozy-stack-${VERSION_STRING}.sha256".
 do_release() {
-	check_env
-
+	do_assets
 	do_build
-	openssl dgst -sha256 -hex "${BINARY}" > "${BINARY}.sha256"
 
+	openssl dgst -sha256 -hex "${BINARY}" > "${BINARY}.sha256"
 	printf "%s\t" "${BINARY}"
 	sed -E 's/SHA256\((.*)\)= ([a-f0-9]+)$/\2/g' < "${BINARY}.sha256"
 }
 
 do_install() {
 	check_env
-
 	do_prepare_ldflags
 
 	printf "installing cozy-stack in %s... " "$(go env GOPATH)"
@@ -114,9 +82,7 @@ do_install() {
 
 do_build() {
 	check_env
-
 	do_prepare_ldflags
-	do_assets
 
 	if [ -z "${1}" ]; then
 		BINARY="$(pwd)/cozy-stack-${VERSION_OS_ARCH}-${VERSION_STRING}"
@@ -136,10 +102,40 @@ do_build() {
 	echo "ok"
 }
 
+do_prepare_ldflags() {
+	eval "$(go env)"
+
+	VERSION_OS_ARCH="${GOOS}-${GOARCH}"
+	if [ -z "${VERSION_STRING}" ]; then
+		VERSION_STRING=$(git -C "${WORK_DIR}" --work-tree="${WORK_DIR}" \
+			describe --tags --dirty 2> /dev/null)
+
+		if [ -z "${VERSION_STRING}" ]; then
+			VERSION_STRING="v0-$(git -C "${WORK_DIR}" rev-parse --short HEAD)"
+			echo_wrn "No tag has been found to version the stack, using \"${VERSION_STRING}\" as version number"
+		fi
+
+		if ! git -C "${WORK_DIR}" diff --exit-code HEAD &>/dev/null; then
+			if [ "${COZY_ENV}" == "production" ]; then
+				echo_err "Can not build a production release in a dirty work-tree"
+				exit 1
+			fi
+			VERSION_STRING="${VERSION_STRING}-dirty"
+		fi
+
+		if [ "${COZY_ENV}" == "development" ]; then
+			VERSION_STRING="${VERSION_STRING}-dev"
+		fi
+	fi
+
+	BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
+	BUILD_MODE="${COZY_ENV}"
+}
+
 do_assets() {
 	tx --root "${WORK_DIR}" pull -a || echo "Do you have configured transifex?"
 	printf "executing go generate...\n"
-	go get -u github.com/cozy/cozy-stack/pkg/statik
+	go get github.com/cozy/cozy-stack/pkg/statik
 	pushd "${WORK_DIR}" > /dev/null
 	go generate ./web
 	popd > /dev/null
@@ -238,7 +234,7 @@ case "${1}" in
 		;;
 
 	dev)
-		COZY_ENV=development do_build scripts/cozy-stack
+		COZY_ENV=development do_build cozy-stack
 		;;
 
 	*)
diff --git a/scripts/cozy-app-dev.sh b/scripts/cozy-app-dev.sh
index 5a605d8c375aa6b649ea1908cd6b0f14641ccd53..eb231a80599f8a66cbcd839447c271a1344876f6 100755
--- a/scripts/cozy-app-dev.sh
+++ b/scripts/cozy-app-dev.sh
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-set -eu
+set -e
 set -m
 
 [ -z "${COZY_STACK_HOST}" ] && COZY_STACK_HOST="cozy.tools"
diff --git a/scripts/release.sh b/scripts/release.sh
index 792c67cd738841bb8b2c29c2badef541fecfb8d3..acabc8b8b67af7a46f082f69a4f7acb3ae6ae8c9 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -5,8 +5,7 @@ RELEASE="$(git describe --tags)"
 
 go get -u -v ./...
 
-GOOS=linux   GOARCH=amd64 ./scripts/build.sh dev
-docker build -t "cozy/cozy-app-dev:${RELEASE}" scripts
+docker build -t "cozy/cozy-app-dev:${RELEASE}" -f scripts/Dockerfile .
 docker push "cozy/cozy-app-dev:${RELEASE}"
 docker tag "cozy/cozy-app-dev:${RELEASE}" cozy/cozy-app-dev
 docker push cozy/cozy-app-dev