diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 55fff2e1e3f96bb88650613d75ee2230ace175a8..dfed0212829d67afa359449b944d36569d9cdcd1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -294,6 +294,8 @@ jug_dev:default:
         echo "FORCE_NOCACHE set"
         export CACHE_FLAG="--no-cache"
       fi
+    ## Setup mirrors.yaml with rw mirror secrets
+    - cat mirrors.yaml.in | envsubst > mirrors.yaml
     ## Build targets
     - for target in ${TARGETS} ; do
         if [ ! ${target} = export ] ; then
@@ -319,11 +321,10 @@ jug_dev:default:
                    --build-arg EICSPACK_CHERRYPICKS="${EICSPACK_CHERRYPICKS}"
                    --build-arg S3_ACCESS_KEY="${S3_ACCESS_KEY}"
                    --build-arg S3_SECRET_KEY="${S3_SECRET_KEY}"
-                   --build-arg S3RW_ACCESS_KEY="${S3RW_ACCESS_KEY}"
-                   --build-arg S3RW_SECRET_KEY="${S3RW_SECRET_KEY}"
                    --build-arg INTERNAL_TAG=${INTERNAL_TAG}
                    --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD)
                    --build-context spack=.
+                   --secret id=mirrors,src=mirrors.yaml
                    containers/jug
       ; done
 
diff --git a/containers/jug/dev.Dockerfile b/containers/jug/dev.Dockerfile
index 1cf66eea12099add086fb39fe07174e95c6ba425..dadd86b9abe8e7ea0bc0253982c674c3735b7c7f 100644
--- a/containers/jug/dev.Dockerfile
+++ b/containers/jug/dev.Dockerfile
@@ -54,7 +54,7 @@ RUN declare -A arch=(                                                   \
  && spack config blame packages                                         \
  && spack config --scope site add "config:suppress_gpg_warnings:true"   \
  && spack config --scope site add "config:build_jobs:${jobs}"           \
- && spack config --scope site add "config:db_lock_timeout:120"          \
+ && spack config --scope site add "config:db_lock_timeout:${jobs}0"     \
  && spack config --scope site add "config:install_tree:root:/opt/software" \
  && spack config blame config                                           \
  && spack compiler find --scope site                                    \
@@ -69,7 +69,9 @@ RUN --mount=type=cache,target=/var/cache/spack-mirror                   \
  && spack buildcache update-index -d /var/cache/spack-mirror            \
  && spack mirror list
 
-## Setup eic-spack buildcache mirrors (FIXME: leaks credentials into layer)
+## Setup eic-spack buildcache mirrors
+## - this always adds the read-only mirror to the container
+## - the write-enabled mirror is provided later as a secret mount
 ARG S3_ACCESS_KEY=""
 ARG S3_SECRET_KEY=""
 RUN --mount=type=cache,target=/var/cache/spack-mirror                   \
@@ -101,19 +103,18 @@ RUN git clone https://github.com/${EICSPACK_ORGREPO}.git ${EICSPACK_ROOT}     \
     fi                                                                  \
  && spack repo add --scope site "${EICSPACK_ROOT}"
 
-## Setup our custom environment
+## Setup our custom environment (secret mount for write-enabled mirror)
 COPY --from=spack spack-environment/ /opt/spack-environment/
 ARG ENV=dev
 RUN --mount=type=cache,target=/var/cache/spack-mirror,sharing=locked    \
+    --mount=type=secret,id=mirrors,target=/opt/spack/etc/spack/mirrors.yaml \
     cd /opt/spack-environment                                           \
  && source $SPACK_ROOT/share/spack/setup-env.sh                         \
  && spack env activate --dir /opt/spack-environment/${ENV}              \
  && make --jobs ${jobs} --keep-going --directory /opt/spack-environment \
     SPACK_ENV=${ENV}                                                    \
-    BUILDCACHE_DIR=/var/cache/spack-mirror
-# FIXME disabled S3 buildcache until multipart upload fixed
-#                              \
-#    BUILDCACHE_MIRROR=eic-spack
+    BUILDCACHE_DIR=/var/cache/spack-mirror                              \
+    BUILDCACHE_MIRROR=eic-spack
 
 ## Create view at /usr/local
 RUN --mount=type=cache,target=/var/cache/spack-mirror,sharing=locked    \
diff --git a/mirrors.yaml.in b/mirrors.yaml.in
new file mode 100644
index 0000000000000000000000000000000000000000..b276a8a34421ad97098c4d1ad582179792a39a69
--- /dev/null
+++ b/mirrors.yaml.in
@@ -0,0 +1,18 @@
+mirrors:
+  eic-spack:
+    fetch:
+      url: s3://eictest/EPIC/spack
+      access_pair:
+      - ${S3RW_ACCESS_KEY}
+      - ${S3RW_SECRET_KEY}
+      access_token: null
+      profile: null
+      endpoint_url: https://eics3.sdcc.bnl.gov:9000
+    push:
+      url: s3://eictest/EPIC/spack
+      access_pair:
+      - ${S3RW_ACCESS_KEY}
+      - ${S3RW_SECRET_KEY}
+      access_token: null
+      profile: null
+      endpoint_url: https://eics3.sdcc.bnl.gov:9000