Consolidate package.json since they are identical modulo a name which is not semantically meaningful.
diff --git a/core/nodejs10Action/build.gradle b/core/nodejs10Action/build.gradle
index c1b302b..b52bdaf 100644
--- a/core/nodejs10Action/build.gradle
+++ b/core/nodejs10Action/build.gradle
@@ -26,6 +26,7 @@
 ext.dockerImageName = 'action-nodejs-v10'
 apply from: '../../gradle/docker.gradle'
 
+distDocker.dependsOn 'copyPackageJson'
 distDocker.dependsOn 'copyProxy'
 distDocker.dependsOn 'copyRunner'
 distDocker.dependsOn 'copyService'
@@ -35,6 +36,11 @@
 distDocker.dependsOn 'copyBuildTemplate'
 distDocker.finalizedBy('cleanup')
 
+task copyPackageJson(type: Copy) {
+    from '../nodejsActionBase/package.json'
+    into '.'
+}
+
 task copyProxy(type: Copy) {
     from '../nodejsActionBase/app.js'
     into '.'
@@ -71,6 +77,7 @@
 }
 
 task cleanup(type: Delete) {
+    delete 'package.json'
     delete 'app.js'
     delete 'runner.js'
     delete 'src'
diff --git a/core/nodejs10Action/package.json b/core/nodejs10Action/package.json
deleted file mode 100644
index d502984..0000000
--- a/core/nodejs10Action/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "name": "action-nodejs-v10",
-  "version": "1.0.0",
-  "description": "Apache OpenWhisk NodeJS Runtime",
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:apache/openwhisk-runtime-nodejs.git"
-  },
-  "license": "Apache-2.0",
-  "dependencies": {
-    "openwhisk": "3.21.2",
-    "body-parser": "1.18.3",
-    "express": "4.16.4",
-    "serialize-error": "3.0.0",
-    "redis": "2.8.0",
-    "uuid": "3.3.0"
-  }
-}
diff --git a/core/nodejs12Action/build.gradle b/core/nodejs12Action/build.gradle
index 203a5c1..ae773f6 100644
--- a/core/nodejs12Action/build.gradle
+++ b/core/nodejs12Action/build.gradle
@@ -26,6 +26,7 @@
 ext.dockerImageName = 'action-nodejs-v12'
 apply from: '../../gradle/docker.gradle'
 
+distDocker.dependsOn 'copyPackageJson'
 distDocker.dependsOn 'copyProxy'
 distDocker.dependsOn 'copyRunner'
 distDocker.dependsOn 'copyService'
@@ -35,6 +36,11 @@
 distDocker.dependsOn 'copyBuildTemplate'
 distDocker.finalizedBy('cleanup')
 
+task copyPackageJson(type: Copy) {
+    from '../nodejsActionBase/package.json'
+    into '.'
+}
+
 task copyProxy(type: Copy) {
     from '../nodejsActionBase/app.js'
     into '.'
@@ -71,6 +77,7 @@
 }
 
 task cleanup(type: Delete) {
+    delete 'package.json'
     delete 'app.js'
     delete 'runner.js'
     delete 'src'
diff --git a/core/nodejs12Action/package.json b/core/nodejs12Action/package.json
deleted file mode 100644
index 1849c3f..0000000
--- a/core/nodejs12Action/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "name": "action-nodejs-v12",
-  "version": "1.0.0",
-  "description": "Apache OpenWhisk NodeJS Runtime",
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:apache/openwhisk-runtime-nodejs.git"
-  },
-  "license": "Apache-2.0",
-  "dependencies": {
-    "openwhisk": "3.21.2",
-    "body-parser": "1.18.3",
-    "express": "4.16.4",
-    "serialize-error": "3.0.0",
-    "redis": "2.8.0",
-    "uuid": "3.3.0"
-  }
-}
diff --git a/core/nodejs14Action/build.gradle b/core/nodejs14Action/build.gradle
index da173e2..85e0796 100644
--- a/core/nodejs14Action/build.gradle
+++ b/core/nodejs14Action/build.gradle
@@ -26,6 +26,7 @@
 ext.dockerImageName = 'action-nodejs-v14'
 apply from: '../../gradle/docker.gradle'
 
+distDocker.dependsOn 'copyPackageJson'
 distDocker.dependsOn 'copyProxy'
 distDocker.dependsOn 'copyRunner'
 distDocker.dependsOn 'copyService'
@@ -35,6 +36,11 @@
 distDocker.dependsOn 'copyBuildTemplate'
 distDocker.finalizedBy('cleanup')
 
+task copyPackageJson(type: Copy) {
+    from '../nodejsActionBase/package.json'
+    into '.'
+}
+
 task copyProxy(type: Copy) {
     from '../nodejsActionBase/app.js'
     into '.'
@@ -71,6 +77,7 @@
 }
 
 task cleanup(type: Delete) {
+    delete 'package.json'
     delete 'app.js'
     delete 'runner.js'
     delete 'src'
diff --git a/core/nodejs14Action/package.json b/core/nodejs14Action/package.json
deleted file mode 100644
index b06d6a0..0000000
--- a/core/nodejs14Action/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "name": "action-nodejs-v14",
-  "version": "1.0.0",
-  "description": "Apache OpenWhisk NodeJS Runtime",
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:apache/openwhisk-runtime-nodejs.git"
-  },
-  "license": "Apache-2.0",
-  "dependencies": {
-    "openwhisk": "3.21.2",
-    "body-parser": "1.18.3",
-    "express": "4.16.4",
-    "serialize-error": "3.0.0",
-    "redis": "2.8.0",
-    "uuid": "3.3.0"
-  }
-}
diff --git a/core/nodejs8Action/build.gradle b/core/nodejs8Action/build.gradle
index a671ef8..e9cdc7b 100644
--- a/core/nodejs8Action/build.gradle
+++ b/core/nodejs8Action/build.gradle
@@ -26,6 +26,7 @@
 ext.dockerImageName = 'action-nodejs-v8'
 apply from: '../../gradle/docker.gradle'
 
+distDocker.dependsOn 'copyPackageJson'
 distDocker.dependsOn 'copyProxy'
 distDocker.dependsOn 'copyRunner'
 distDocker.dependsOn 'copyService'
@@ -35,6 +36,11 @@
 distDocker.dependsOn 'copyBuildTemplate'
 distDocker.finalizedBy('cleanup')
 
+task copyPackageJson(type: Copy) {
+    from '../nodejsActionBase/package.json'
+    into '.'
+}
+
 task copyProxy(type: Copy) {
     from '../nodejsActionBase/app.js'
     into '.'
@@ -71,6 +77,7 @@
 }
 
 task cleanup(type: Delete) {
+    delete 'package.json'
     delete 'app.js'
     delete 'runner.js'
     delete 'src'
diff --git a/core/nodejs8Action/package.json b/core/nodejs8Action/package.json
deleted file mode 100644
index bfe1419..0000000
--- a/core/nodejs8Action/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "name": "action-nodejs-v8",
-  "version": "1.0.0",
-  "description": "Apache OpenWhisk NodeJS Runtime",
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:apache/openwhisk-runtime-nodejs.git"
-  },
-  "license": "Apache-2.0",
-  "dependencies": {
-    "openwhisk": "3.21.2",
-    "body-parser": "1.18.2",
-    "express": "4.16.2",
-    "serialize-error": "3.0.0",
-    "redis": "2.8.0",
-    "uuid": "3.3.0"
-  }
-}
diff --git a/core/typescript37Action/.dockerignore b/core/typescript37Action/.dockerignore
new file mode 100644
index 0000000..a1d03cb
--- /dev/null
+++ b/core/typescript37Action/.dockerignore
@@ -0,0 +1,13 @@
+*.*~
+*.yaml
+*.tmpl
+*.gradle
+.dockerignore
+.project
+.settings
+build.xml
+Dockerfile
+logs
+node_modules
+package-lock.json
+test.js
diff --git a/core/typescript37Action/Dockerfile b/core/typescript37Action/Dockerfile
index 0852224..4b5b0c4 100644
--- a/core/typescript37Action/Dockerfile
+++ b/core/typescript37Action/Dockerfile
@@ -14,34 +14,46 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
+
 FROM golang:1.12 as builder
 RUN env CGO_ENABLED=0 go get github.com/apache/openwhisk-runtime-go/main \
     && mv /go/bin/main /bin/proxy
+
 FROM node:12.1.0-stretch
-ENV TYPESCRIPT_VERSION=3.7.4
 COPY --from=builder /bin/proxy /bin/proxy
+
+ENV TYPESCRIPT_VERSION=3.7.4
+ENV OW_COMPILER=/bin/compile
+ENV OW_LOG_INIT_ERROR=1
+ENV OW_WAIT_FOR_ACK=1
+ENV OW_EXECUTION_ENV=openwhisk/typescript3.7
+
+# Initial update and some basics.
+#
 RUN apt-get update && apt-get install -y \
     imagemagick \
     graphicsmagick \
     unzip \
     && rm -rf /var/lib/apt/lists/* &&\
     mkdir -p /app/action
-RUN cd /app ;\
-  npm install -g yarn ;\
-  npm install -g typescript@${TYPESCRIPT_VERSION} ;\
-  echo '{"private":true}' > package.json ;\
-  npm install --save --no-package-lock --production \
-  @types/node@13.13.5 \
-  openwhisk@3.21.2 \
-  redis@2.8.0 \
-  uuid@3.0.0 \
-  && npm cache clean --force
+
+# Add sources and copy the package.json to root container,
+# so npm packages from user functions take precendence.
+#
 WORKDIR /app
-EXPOSE 8080
 COPY bin/compile /bin/compile
 COPY lib/launcher.ts /lib/launcher.ts
-ENV OW_COMPILER=/bin/compile
-ENV OW_LOG_INIT_ERROR=1
-ENV OW_WAIT_FOR_ACK=1
-ENV OW_EXECUTION_ENV=openwhisk/typescript3.7
+COPY package.json /
+
+# Customize runtime with additional packages.
+#
+RUN cd / && npm install -g \
+  yarn \
+  typescript@${TYPESCRIPT_VERSION} \
+  && npm install --no-package-lock --production @types/node@13.13.5 \
+  && npm install --no-package-lock --production \
+  && npm cache clean --force
+
+EXPOSE 8080
+
 ENTRYPOINT ["/bin/proxy"]
diff --git a/core/typescript37Action/build.gradle b/core/typescript37Action/build.gradle
index 0476518..1a17b56 100644
--- a/core/typescript37Action/build.gradle
+++ b/core/typescript37Action/build.gradle
@@ -17,3 +17,14 @@
 
 ext.dockerImageName = 'action-typescript-v3.7'
 apply from: '../../gradle/docker.gradle'
+
+distDocker.dependsOn 'copyPackageJson'
+
+task copyPackageJson(type: Copy) {
+    from '../nodejsActionBase/package.json'
+    into '.'
+}
+
+task cleanup(type: Delete) {
+    delete 'package.json'
+}