Local build working with Docker but not Balena

Hi,

I’m experimenting with porting WebThings Gateway to balenaOS.

I have a working docker-compose.yml that points to a pre-built image on Docker Hub which I have successfully deployed to a device, but am trying to create a build that uses balena push {local ip address}to build locally on the device during development.

I have an edited docker-compose.yml on my local branch which uses build: . instead of image: webthingsio/gateway:2.0.0-beta.1. This seems to work fine when I build it locally with docker build or docker compose up. However, when I try to build this on-device using balena push {local ip address}, the webthings-gateway service fails to start, with the error:

[Logs]    [2025-08-18T21:24:31.692Z] [webthings-gateway] + WEBTHINGS_HOME=/home/node/.webthings
[Logs]    [2025-08-18T21:24:31.692Z] [webthings-gateway] + args=
[Logs]    [2025-08-18T21:24:31.692Z] [webthings-gateway] + start_task=run-only
[Logs]    [2025-08-18T21:24:31.692Z] [webthings-gateway] + [[ /home/node/.webthings == \/\h\o\m\e\/\n\o\d\e\/\.\w\e\b\t\h\i\n\g\s ]]
[Logs]    [2025-08-18T21:24:31.692Z] [webthings-gateway] + [[ -d /home/node/.mozilla-iot ]]
[Logs]    [2025-08-18T21:24:31.692Z] [webthings-gateway] + is_container
[Logs]    [2025-08-18T21:24:31.693Z] [webthings-gateway] + '[' -f /.dockerenv ']'
[Logs]    [2025-08-18T21:24:31.693Z] [webthings-gateway] + return 0
[Logs]    [2025-08-18T21:24:31.694Z] [webthings-gateway] ++ node --version
[Logs]    [2025-08-18T21:24:31.694Z] [webthings-gateway] ++ egrep -o '[0-9]+'
[Logs]    [2025-08-18T21:24:31.695Z] [webthings-gateway] ++ head -n1
[Logs]    [2025-08-18T21:24:31.696Z] [webthings-gateway] + _node_version=20
[Logs]    [2025-08-18T21:24:31.696Z] [webthings-gateway] + [[ ! -f /home/node/.webthings/.node_version ]]
[Logs]    [2025-08-18T21:24:31.696Z] [webthings-gateway] + mkdir -p /home/node/.webthings/config
[Logs]    [2025-08-18T21:24:31.697Z] [webthings-gateway] + cd /home/node/webthings/gateway
[Logs]    [2025-08-18T21:24:31.697Z] [webthings-gateway] + ./tools/update-addons.sh
[Logs]    [2025-08-18T21:24:31.698Z] [webthings-gateway] + export NVM_DIR=/home/node/.nvm
[Logs]    [2025-08-18T21:24:31.698Z] [webthings-gateway] + NVM_DIR=/home/node/.nvm
[Logs]    [2025-08-18T21:24:31.698Z] [webthings-gateway] + '[' -s /home/node/.nvm/nvm.sh ']'
[Logs]    [2025-08-18T21:24:31.698Z] [webthings-gateway] +++ dirname ./tools/update-addons.sh
[Logs]    [2025-08-18T21:24:31.699Z] [webthings-gateway] ++ readlink -f ./tools
[Logs]    [2025-08-18T21:24:31.699Z] [webthings-gateway] + node /home/node/webthings/gateway/tools/update-addons.js
[Logs]    [2025-08-18T21:24:31.726Z] [webthings-gateway] node:internal/modules/cjs/loader:1215
[Logs]    [2025-08-18T21:24:31.726Z] [webthings-gateway]   throw err;
[Logs]    [2025-08-18T21:24:31.726Z] [webthings-gateway]   ^
[Logs]    [2025-08-18T21:24:31.726Z] [webthings-gateway] 
[Logs]    [2025-08-18T21:24:31.726Z] [webthings-gateway] Error: Cannot find module '../build/migrate'
[Logs]    [2025-08-18T21:24:31.726Z] [webthings-gateway] Require stack:
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway] - /home/node/webthings/gateway/tools/update-addons.js
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Module._resolveFilename (node:internal/modules/cjs/loader:1212:15)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Module._load (node:internal/modules/cjs/loader:1043:27)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Module.require (node:internal/modules/cjs/loader:1298:19)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at require (node:internal/modules/helpers:182:18)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Object.<anonymous> (/home/node/webthings/gateway/tools/update-addons.js:1:17)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Module._compile (node:internal/modules/cjs/loader:1529:14)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Module.load (node:internal/modules/cjs/loader:1275:32)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Module._load (node:internal/modules/cjs/loader:1096:12)
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:164:12) {
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]   code: 'MODULE_NOT_FOUND',
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway]   requireStack: [ '/home/node/webthings/gateway/tools/update-addons.js' ]
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway] }
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway] 
[Logs]    [2025-08-18T21:24:31.727Z] [webthings-gateway] Node.js v20.19.4

It appears that the build directory inside the docker image does not contain the .js files that I would expect to have been compiled by TypeScript with npm run build.

When I log into a container using the image built locally with Docker I can see the properly populated contents of the build directory:

root@7bd8499c2554:/home/node/webthings/gateway/build# ls
addon-loader.d.ts	      certificate-manager.js.map  fluent.d.ts		   passwords.d.ts.map	  sleep.js.map
addon-loader.d.ts.map	      constants.d.ts		  fluent.d.ts.map	   passwords.js		  static
addon-loader.js		      constants.d.ts.map	  iso-639		   passwords.js.map	  test
addon-loader.js.map	      constants.js		  jwt-middleware.d.ts	   platform.d.ts	  tunnel-service.d.ts
addon-manager.d.ts	      constants.js.map		  jwt-middleware.d.ts.map  platform.d.ts.map	  tunnel-service.d.ts.map
addon-manager.d.ts.map	      controllers		  jwt-middleware.js	   platform.js		  tunnel-service.js
addon-manager.js	      db.d.ts			  jwt-middleware.js.map    platform.js.map	  tunnel-service.js.map
addon-manager.js.map	      db.d.ts.map		  log-timestamps.d.ts	   platforms		  user-profile.d.ts
addon-utils.d.ts	      db.js			  log-timestamps.d.ts.map  plugin		  user-profile.d.ts.map
addon-utils.d.ts.map	      db.js.map			  log-timestamps.js	   push-service.d.ts	  user-profile.js
addon-utils.js		      deferred.d.ts		  log-timestamps.js.map    push-service.d.ts.map  user-profile.js.map
addon-utils.js.map	      deferred.d.ts.map		  migrate.d.ts		   push-service.js	  utils.d.ts
addons-test		      deferred.js		  migrate.d.ts.map	   push-service.js.map	  utils.d.ts.map
api.d.ts		      deferred.js.map		  migrate.js		   router.d.ts		  utils.js
api.d.ts.map		      ec-crypto.d.ts		  migrate.js.map	   router.d.ts.map	  utils.js.map
app.d.ts		      ec-crypto.d.ts.map	  models		   router.js		  views
app.d.ts.map		      ec-crypto.js		  oauth-types.d.ts	   router.js.map	  wifi-setup.d.ts
app.js			      ec-crypto.js.map		  oauth-types.d.ts.map	   rules-engine		  wifi-setup.d.ts.map
app.js.map		      errors.d.ts		  oauth-types.js	   schema-form		  wifi-setup.js
certificate-manager.d.ts      errors.d.ts.map		  oauth-types.js.map	   sleep.d.ts		  wifi-setup.js.map
certificate-manager.d.ts.map  errors.js			  package.json		   sleep.d.ts.map
certificate-manager.js	      errors.js.map		  passwords.d.ts	   sleep.js

However, when I log into a container using the image created by balena push I note that the output JavaScript files are missing:

root@6e3d400caa0b:/home/node/webthings/gateway/build# ls
addons-test  api.d.ts.map  fluent.d.ts	    iso-639  package.json  plugin	 schema-form  static  utils.d.ts      views
api.d.ts     controllers   fluent.d.ts.map  models   platforms	   rules-engine  src	      test    utils.d.ts.map

What is odd is that I can see what appears to be the TypeScript compiler completing successfully in the build logs, but then the build directory does not contain the files it is supposed to.

I am not super experienced with Docker or balenaOS so it’s possible I’m just missing something obvious, but are there differences between docker compose up and balena push that could account for this difference?

Thank you.

Have you tried a search in the container for some of those build files to see where they might be being placed since the compiler appears to be completing successfully?

I’m also curious if you get the same result trying the build without mapping the volume?

@alanb128 Thank you for your reply :slight_smile:

Good call!

I have discovered that with balena push (but not docker build) the built files somehow output to build/src/ instead of build/

root@dac94a72d53d:/home/node/webthings/gateway/build/src# ls
addon-loader.d.ts	      constants.d.ts	  iso-639		   passwords.js		  test
addon-loader.d.ts.map	      constants.d.ts.map  jwt-middleware.d.ts	   passwords.js.map	  tunnel-service.d.ts
addon-loader.js		      constants.js	  jwt-middleware.d.ts.map  platform.d.ts	  tunnel-service.d.ts.map
addon-loader.js.map	      constants.js.map	  jwt-middleware.js	   platform.d.ts.map	  tunnel-service.js
addon-manager.d.ts	      controllers	  jwt-middleware.js.map    platform.js		  tunnel-service.js.map
addon-manager.d.ts.map	      db.d.ts		  log-timestamps.d.ts	   platform.js.map	  user-profile.d.ts
addon-manager.js	      db.d.ts.map	  log-timestamps.d.ts.map  platforms		  user-profile.d.ts.map
addon-manager.js.map	      db.js		  log-timestamps.js	   plugin		  user-profile.js
addon-utils.d.ts	      db.js.map		  log-timestamps.js.map    push-service.d.ts	  user-profile.js.map
addon-utils.d.ts.map	      deferred.d.ts	  migrate.d.ts		   push-service.d.ts.map  utils.d.ts
addon-utils.js		      deferred.d.ts.map   migrate.d.ts.map	   push-service.js	  utils.d.ts.map
addon-utils.js.map	      deferred.js	  migrate.js		   push-service.js.map	  utils.js
addons-test		      deferred.js.map	  migrate.js.map	   router.d.ts		  utils.js.map
app.d.ts		      ec-crypto.d.ts	  models		   router.d.ts.map	  wifi-setup.d.ts
app.d.ts.map		      ec-crypto.d.ts.map  oauth-types.d.ts	   router.js		  wifi-setup.d.ts.map
app.js			      ec-crypto.js	  oauth-types.d.ts.map	   router.js.map	  wifi-setup.js
app.js.map		      ec-crypto.js.map	  oauth-types.js	   rules-engine		  wifi-setup.js.map
certificate-manager.d.ts      errors.d.ts	  oauth-types.js.map	   sleep.d.ts
certificate-manager.d.ts.map  errors.d.ts.map	  package.json		   sleep.d.ts.map
certificate-manager.js	      errors.js		  passwords.d.ts	   sleep.js
certificate-manager.js.map    errors.js.map	  passwords.d.ts.map	   sleep.js.map

…but I have no idea why!

For reference, npm run build runs the following commands:

rm -rf build && cp -rL src build && find build -name ‘*.ts’ -delete && tsc -p . && webpack

I’m not sure I completely understand what you mean with this, but if I remove the named volume from docker-compose altogether I get the same result (same error).

Do you have any further suggestions?

This is wild. If I manually run this same command in both a container built by docker and a container built by balena (with the same docker-compose.yml and Dockerfile)…

$ cd /home/node/webthings/gateway && npm ci && npm run build

…I get a different result.

root@08fc1e3ee324:/home/node/webthings/gateway# ls build
addons-test  api.d.ts.map  fluent.d.ts	    iso-639  package.json  plugin	 schema-form  static  utils.d.ts      views
api.d.ts     controllers   fluent.d.ts.map  models   platforms	   rules-engine  src	      test    utils.d.ts.map
# ls build
addon-loader.d.ts	      certificate-manager.js.map  fluent.d.ts		   passwords.d.ts.map	  sleep.js.map
addon-loader.d.ts.map	      constants.d.ts		  fluent.d.ts.map	   passwords.js		  static
addon-loader.js		      constants.d.ts.map	  iso-639		   passwords.js.map	  test
addon-loader.js.map	      constants.js		  jwt-middleware.d.ts	   platform.d.ts	  tunnel-service.d.ts
addon-manager.d.ts	      constants.js.map		  jwt-middleware.d.ts.map  platform.d.ts.map	  tunnel-service.d.ts.map
addon-manager.d.ts.map	      controllers		  jwt-middleware.js	   platform.js		  tunnel-service.js
addon-manager.js	      db.d.ts			  jwt-middleware.js.map    platform.js.map	  tunnel-service.js.map
addon-manager.js.map	      db.d.ts.map		  log-timestamps.d.ts	   platforms		  user-profile.d.ts
addon-utils.d.ts	      db.js			  log-timestamps.d.ts.map  plugin		  user-profile.d.ts.map
addon-utils.d.ts.map	      db.js.map			  log-timestamps.js	   push-service.d.ts	  user-profile.js
addon-utils.js		      deferred.d.ts		  log-timestamps.js.map    push-service.d.ts.map  user-profile.js.map
addon-utils.js.map	      deferred.d.ts.map		  migrate.d.ts		   push-service.js	  utils.d.ts
addons-test		      deferred.js		  migrate.d.ts.map	   push-service.js.map	  utils.d.ts.map
api.d.ts		      deferred.js.map		  migrate.js		   router.d.ts		  utils.js
api.d.ts.map		      ec-crypto.d.ts		  migrate.js.map	   router.d.ts.map	  utils.js.map
app.d.ts		      ec-crypto.d.ts.map	  models		   router.js		  views
app.d.ts.map		      ec-crypto.js		  oauth-types.d.ts	   router.js.map	  wifi-setup.d.ts
app.js			      ec-crypto.js.map		  oauth-types.d.ts.map	   rules-engine		  wifi-setup.d.ts.map
app.js.map		      errors.d.ts		  oauth-types.js	   schema-form		  wifi-setup.js
certificate-manager.d.ts      errors.d.ts.map		  oauth-types.js.map	   sleep.d.ts		  wifi-setup.js.map
certificate-manager.d.ts.map  errors.js			  package.json		   sleep.d.ts.map
certificate-manager.js	      errors.js.map		  passwords.d.ts	   sleep.js

With balena the output of tsc ends up in build/src/ instead of build/

What am I missing?

BTW I tried simplifying the npm build script to "build": "rm -rf build && tsc -p . && webpack" in case it was doing something weird, but I still got the same result.

balena ssh ip

balena ps

balena devices

balena push id.local

Hey @benfrancis , what version of the balena CLI are you running? It seems almost like your tsconfig.json is not being sent to the balena build servers.

Have you inspected your local .dockerignore closely? It should be the same behaviour for both Docker and balena but just in case there may be a clue in there if you change the values a bit.

Thank you for the replies.

@rojasyal Sorry I don’t understand how this series of commands is supposed to help, can you please explain? I can see the IP address of the device on my local network in Balena Cloud and that’s the IP address I’m pushing to.

@klutchell Balena CLI 22.1.1

As I understand it using balena push with a local IP address should push the source to the device rather than Balena’s build servers, right?

The contents of .dockerignore is here (also pasted below):

*~
Dockerfile

#{ [[./.gitignore]]
# Standard artifacts
*.swp
.DS_Store
.nyc_output/
.cache-loader/

# Build artifacts
/build
node_modules/
static/js/lib/stm_web.min.js

# Run-time artifacts
.node-persist/
config/local.js
static/uploads
.post_upgrade_complete
/browser-test-output
#} [[./.gitignore]]

I have tried removing Dockerfile from .dockerignore but that didn’t help.

Any other suggestions?

I can confirm that tsconfig.json is present inside the container and I’ve narrowed it down to the command tsc -p . (part of the npm run build script) exhibiting different behaviour in an image built using balena push 192.168.1.44 vs. a local build or a build created by docker.

When I run tsc -p . locally TypeScript compiles JavaScript files correctly directly inside the build/ folder, but when I run it inside the container created by balena it outputs JavaScript files to build/src.

I feel like I’m missing something obvious but I don’t know what is causing this difference.

At first I thought it might be caused by cp having a different result depending on whether the target directory already exists, but that doesn’t seem to be the issue.

I’m still baffled by this.

Image built with Docker:

node@6fc0783b21a3:~/webthings/gateway$ ./node_modules/typescript/bin/tsc -p .
node@6fc0783b21a3:~/webthings/gateway$ ls -al build/
total 696
drwxr-xr-x 11 node node  4096 Sep  5 17:56 .
drwxr-xr-x  1 node node  4096 Sep  5 17:54 ..
-rw-r--r--  1 node node    53 Sep  5 17:56 addon-loader.d.ts
-rw-r--r--  1 node node   118 Sep  5 17:56 addon-loader.d.ts.map
-rw-r--r--  1 node node  7460 Sep  5 17:56 addon-loader.js
-rw-r--r--  1 node node  4876 Sep  5 17:56 addon-loader.js.map
-rw-r--r--  1 node node 12576 Sep  5 17:56 addon-manager.d.ts
-rw-r--r--  1 node node  4997 Sep  5 17:56 addon-manager.d.ts.map
-rw-r--r--  1 node node 43748 Sep  5 17:56 addon-manager.js
-rw-r--r--  1 node node 28114 Sep  5 17:56 addon-manager.js.map
-rw-r--r--  1 node node   609 Sep  5 17:56 addon-utils.d.ts
-rw-r--r--  1 node node   270 Sep  5 17:56 addon-utils.d.ts.map
-rw-r--r--  1 node node 12006 Sep  5 17:56 addon-utils.js
-rw-r--r--  1 node node  7443 Sep  5 17:56 addon-utils.js.map
drwxr-xr-x  5 node node  4096 Sep  5 17:54 addons-test
-rw-r--r--  1 node node   373 Sep  5 17:56 app.d.ts
-rw-r--r--  1 node node   461 Sep  5 17:56 app.d.ts.map
-rw-r--r--  1 node node 13695 Sep  5 17:56 app.js
-rw-r--r--  1 node node  9442 Sep  5 17:56 app.js.map
-rw-r--r--  1 node node  1217 Sep  5 17:56 certificate-manager.d.ts
-rw-r--r--  1 node node   604 Sep  5 17:56 certificate-manager.d.ts.map
-rw-r--r--  1 node node 13078 Sep  5 17:56 certificate-manager.js
-rw-r--r--  1 node node  8439 Sep  5 17:56 certificate-manager.js.map
-rw-r--r--  1 node node  4487 Sep  5 17:56 constants.d.ts
-rw-r--r--  1 node node  2811 Sep  5 17:56 constants.d.ts.map
-rw-r--r--  1 node node  6837 Sep  5 17:56 constants.js
-rw-r--r--  1 node node  3076 Sep  5 17:56 constants.js.map
drwxr-xr-x  2 node node  4096 Sep  5 17:56 controllers
-rw-r--r--  1 node node  6096 Sep  5 17:56 db.d.ts
-rw-r--r--  1 node node  2894 Sep  5 17:56 db.d.ts.map
-rw-r--r--  1 node node 17558 Sep  5 17:56 db.js
-rw-r--r--  1 node node 11684 Sep  5 17:56 db.js.map
-rw-r--r--  1 node node   413 Sep  5 17:56 deferred.d.ts
-rw-r--r--  1 node node   434 Sep  5 17:56 deferred.d.ts.map
-rw-r--r--  1 node node   807 Sep  5 17:56 deferred.js
-rw-r--r--  1 node node   743 Sep  5 17:56 deferred.js.map
-rw-r--r--  1 node node   742 Sep  5 17:56 ec-crypto.d.ts
-rw-r--r--  1 node node   259 Sep  5 17:56 ec-crypto.d.ts.map
-rw-r--r--  1 node node  2839 Sep  5 17:56 ec-crypto.js
-rw-r--r--  1 node node  1866 Sep  5 17:56 ec-crypto.js.map
-rw-r--r--  1 node node   327 Sep  5 17:56 errors.d.ts
-rw-r--r--  1 node node   421 Sep  5 17:56 errors.d.ts.map
-rw-r--r--  1 node node   325 Sep  5 17:56 errors.js
-rw-r--r--  1 node node   243 Sep  5 17:56 errors.js.map
drwxr-xr-x  2 node node  4096 Sep  5 17:56 iso-639
-rw-r--r--  1 node node  1392 Sep  5 17:56 jwt-middleware.d.ts
-rw-r--r--  1 node node   672 Sep  5 17:56 jwt-middleware.d.ts.map
-rw-r--r--  1 node node  5894 Sep  5 17:56 jwt-middleware.js
-rw-r--r--  1 node node  3497 Sep  5 17:56 jwt-middleware.js.map
-rw-r--r--  1 node node   375 Sep  5 17:56 log-timestamps.d.ts
-rw-r--r--  1 node node   147 Sep  5 17:56 log-timestamps.d.ts.map
-rw-r--r--  1 node node  6270 Sep  5 17:56 log-timestamps.js
-rw-r--r--  1 node node  5448 Sep  5 17:56 log-timestamps.js.map
-rw-r--r--  1 node node   457 Sep  5 17:56 migrate.d.ts
-rw-r--r--  1 node node   202 Sep  5 17:56 migrate.d.ts.map
-rw-r--r--  1 node node 11233 Sep  5 17:56 migrate.js
-rw-r--r--  1 node node  8584 Sep  5 17:56 migrate.js.map
drwxr-xr-x  2 node node  4096 Sep  5 17:56 models
-rw-r--r--  1 node node   761 Sep  5 17:56 oauth-types.d.ts
-rw-r--r--  1 node node   860 Sep  5 17:56 oauth-types.d.ts.map
-rw-r--r--  1 node node  3185 Sep  5 17:56 oauth-types.js
-rw-r--r--  1 node node  1994 Sep  5 17:56 oauth-types.js.map
-rw-r--r--  1 node node  6404 Sep  5 17:56 package.json
-rw-r--r--  1 node node  1574 Sep  5 17:56 passwords.d.ts
-rw-r--r--  1 node node   576 Sep  5 17:56 passwords.d.ts.map
-rw-r--r--  1 node node  2388 Sep  5 17:56 passwords.js
-rw-r--r--  1 node node   991 Sep  5 17:56 passwords.js.map
-rw-r--r--  1 node node  4097 Sep  5 17:56 platform.d.ts
-rw-r--r--  1 node node  2200 Sep  5 17:56 platform.d.ts.map
-rw-r--r--  1 node node 11117 Sep  5 17:56 platform.js
-rw-r--r--  1 node node  6340 Sep  5 17:56 platform.js.map
drwxr-xr-x  3 node node  4096 Sep  5 17:56 platforms
drwxr-xr-x  2 node node  4096 Sep  5 17:56 plugin
-rw-r--r--  1 node node   842 Sep  5 17:56 push-service.d.ts
-rw-r--r--  1 node node   477 Sep  5 17:56 push-service.d.ts.map
-rw-r--r--  1 node node  3222 Sep  5 17:56 push-service.js
-rw-r--r--  1 node node  1460 Sep  5 17:56 push-service.js.map
-rw-r--r--  1 node node   673 Sep  5 17:56 router.d.ts
-rw-r--r--  1 node node   393 Sep  5 17:56 router.d.ts.map
-rw-r--r--  1 node node 11326 Sep  5 17:56 router.js
-rw-r--r--  1 node node  6201 Sep  5 17:56 router.js.map
drwxr-xr-x  5 node node  4096 Sep  5 17:56 rules-engine
-rw-r--r--  1 node node    93 Sep  5 17:56 sleep.d.ts
-rw-r--r--  1 node node   171 Sep  5 17:56 sleep.d.ts.map
-rw-r--r--  1 node node   249 Sep  5 17:56 sleep.js
-rw-r--r--  1 node node   267 Sep  5 17:56 sleep.js.map
drwxr-xr-x  7 node node  4096 Sep  5 17:56 test
-rw-r--r--  1 node node  1097 Sep  5 17:56 tunnel-service.d.ts
-rw-r--r--  1 node node   873 Sep  5 17:56 tunnel-service.d.ts.map
-rw-r--r--  1 node node  9384 Sep  5 17:56 tunnel-service.js
-rw-r--r--  1 node node  5751 Sep  5 17:56 tunnel-service.js.map
-rw-r--r--  1 node node   721 Sep  5 17:56 user-profile.d.ts
-rw-r--r--  1 node node   158 Sep  5 17:56 user-profile.d.ts.map
-rw-r--r--  1 node node  1472 Sep  5 17:56 user-profile.js
-rw-r--r--  1 node node   888 Sep  5 17:56 user-profile.js.map
-rw-r--r--  1 node node  1544 Sep  5 17:56 utils.d.ts
-rw-r--r--  1 node node   610 Sep  5 17:56 utils.d.ts.map
-rw-r--r--  1 node node  7514 Sep  5 17:56 utils.js
-rw-r--r--  1 node node  4530 Sep  5 17:56 utils.js.map
drwxr-xr-x  2 node node  4096 Sep  5 17:54 views
-rw-r--r--  1 node node   443 Sep  5 17:56 wifi-setup.d.ts
-rw-r--r--  1 node node   332 Sep  5 17:56 wifi-setup.d.ts.map
-rw-r--r--  1 node node 15662 Sep  5 17:56 wifi-setup.js
-rw-r--r--  1 node node  9223 Sep  5 17:56 wifi-setup.js.map

Image built with Balena:

node@2e8a0c0ef1cd:~/webthings/gateway$ ./node_modules/typescript/bin/tsc -p .
node@2e8a0c0ef1cd:~/webthings/gateway$ ls -al build/
total 64
drwxr-xr-x 13 node node 4096 Sep  5 17:56 .
drwxr-xr-x  1 node node 4096 Sep  5 17:54 ..
drwxr-xr-x  5 node node 4096 Sep  5 17:54 addons-test
drwxr-xr-x  2 node node 4096 Sep  5 17:55 controllers
drwxr-xr-x  2 node node 4096 Sep  5 17:55 iso-639
drwxr-xr-x  2 node node 4096 Sep  5 17:55 models
-rw-r--r--  1 node node 5738 Sep  5 17:54 package.json
drwxr-xr-x  3 node node 4096 Sep  5 17:55 platforms
drwxr-xr-x  2 node node 4096 Sep  5 17:55 plugin
drwxr-xr-x  5 node node 4096 Sep  5 17:55 rules-engine
drwxr-xr-x 10 node node 4096 Sep  5 17:56 src
drwxr-xr-x  3 node node 4096 Sep  5 17:56 static
drwxr-xr-x  7 node node 4096 Sep  5 17:55 test
drwxr-xr-x  2 node node 4096 Sep  5 17:54 views

I’ve checked:

  • Same user
  • Same working directory
  • Same starting contents of ~/webthings/gateway
  • Same version of tsc
  • Same tsconfig.json

… yet different output.

I usually solve that issue by assigning a static IP to the device. That way you avoid changes in the local network that can break the connection. Here’s the link that explains how to set it up: Network Setup on balenaOS | balena

Once you’ve set the static IP, you can use the commands I shared earlier to list the containers locally and even access the running services directly.

Thank you but that is not the problem I am trying to solve.

Since there have been no more suggestions here I have filed a bug against balena-cli to try to get to the bottom of this difference in behaviour.

But please do let me know if you think of anything else!

Just a note to say that I was able to work around this by creating a separate tsconfig.json for the front end and back end code, which makes it more explicit to the TypeScript compiler where to put the compiled JavaScript files from each source directory.

This hasn’t been necessary on any other platform and I still haven’t got to the bottom of the reason for the difference in behaviour.

I’m wondering if it might be caused by differences in the file systems used on the different host operating systems…