1. It is possible to develop and never use ObjectScript, but you will be limited with used language and will not most of the breakthrough features we have in Caché/IRIS. Likely with IRIS you have more capabilities, and even almost as in ObjectScript.
  2. Yes, you can move from Caché to IRIS, maybe you will need some changes in your code. But it's not so much work.
    But if speaking about conversion to any other language. How do you think, is it possible to convert let's say, C# application to Python, or to Java or vice versa? This, of course, depends on, how big is your application, and how much time you ready to spend on this process. No easy way, just complete rewrite, no other ways.

Very interesting question. Actually, it mostly depends on your application and how do you work with private data there. 

You can make application for any number of customers working in one database, with good security which does not allow to access data from one customer by another.  But in this case mostly means, that your application should be designed so, from the beginning.

Another and maybe simplest way is making separate databases for each customer. In Caché you can create multiple namespaces with different databases for each customer, but with the same database for a code of your application. So, you can update all sites at the same time.

Nowadays, I would recommend looking at containerization of application. And with kubernetes you can very fast deploy any new site with completely separate code and data between customers. But it means some work on how to prepare your application to be deployable with kubernetes.

Well, how I would dive into this issue.

  1. Run %SYS.MONLBL in production, for a relevant time gap, at least 1 hour. You can filter it by classes which you care, and get the only line counts, to decrease impact on speed.
  2. So, you can collect summary time for all such Methods.
  3. Change a few of them to the new way as a ClassMethod, from MONLBL you can find the list of frequently used ones. So, will be easy to find what to change.
  4. Run %SYS.MONLBL with the same conditions as in the first time.
  5. Compare results.
  6. Decide

Of course, this way not so easy to realize, and depends on how you deploy code in production. Or maybe it even possible to measure in the testing environment.

This behaviour expected if you use default Docker configuration, look at mention about aufs above in comments.

But, you should use docker version 18.06, because  in newest version already deleted support for AUFS, and InterSystems does not work on overlay driver wchich is used by default in Docker.

when your container run, and you can find it in running state, you can use command

docker ps -a

which will show all existing containers in any state.

and then you can look at the logs of particular container

docker logs `hash shown after run command or assigined name visible in docker ps -a`

looks like you did some changes in your Dockerfile comparing to my example, and you did mistake there. Can you share your Dockerfile, so I could check it?

In my example I have line

ADD $cache-lnxrhx64.tar.gz .

where $cache is variable defined few lines above. And when build will run, it will be replaced with value. But in your case, I see $ensemble, and sure that you don't have such variable, and this follows to the error.