@Eduard Lebedyuk  , @Dmitry Maslennikov 
I tried it and it works:   - v $(pwd):/mnt/share/

I set it for both containers and they read/write to it as any other user would do.

My consequence: 

  • the "Install container" fills all required data
  • the "production container" consumes it.  It's similar as data transfer from 1 process to the other over IRISTEMP  

and I have no need for a merge as in my initial case. 

Thank you @Dmitry Maslennikov !
That confirms that I didn't miss a "magic merge feature".
My way wasn't that complete (I stripped the context example)  
Ending up with base to work with.  So I "just" have to elaborate my Dockefile.

My NodeJS has to start after IRIS anyhow, so iris-main could be great:
But to visualize that it isn't just a fake it ist should run -it what iris runs -d detached.
An additional manual start is no problem.

@Eduard Lebedyuk  you inspired me to try the shared volume  yes

I keep you posted
 

¡Hola Salva! ( @Jose-Tomas Salvador) 

A great contribution. Having this experienced myself I know how much work it was.
A few remarks: 

  • enabling Hyper-V killed my well-grown VMware environment
  • my attempts to install a pure Ubuntu Server distibution failed with various releases.   so I had to accept the pre-selected kits with the graphic interface.
  • the effort to get the network clean in a multi-machine environment was significant   and I had just a week feeling what action were expected from me.
  • finally mapping external volumes for durability wasn't easy and not successful.

Thanks to your description I know that my expectations were just higher than reality.

I finally dropped Docker desktop and returned to my VMware that I used already
before it was supported platform for Caché, wink .  
Especially networking was much easier (to me). 

Maybe a future version might be more convincing.
But as I developed a predecessor of VMware already in 1972.. I'm quite demanding on that subject.  

¡ Saludos desde Viena !
Robert

Your organization seems to run the traditional centralized approach where a few developers worked
in a rather close contact with each other being informed of any change immediately.
Experiencing all cross-over dependencies on code and data directly.

In a distributed / larger organization this information is poor or missing.
So with more people stirring the same pot of code from remote is a risky exercise.
You are well-advised to have local and separated installations for your developers.

The extra effort is to maintain a common code base  and data set for them.
The advantage is that their changes don't interfere with each other.
The next challenge is to keep test data for them consistent.
This may even be harder to achieve than code consistency and requires  precise maintenance and management.
 

As there is no default RANDOM() in Caché/IRIS SQL you have to write it yourself.
Create this class:

Class User.Henry
{ ClassMethod Random(maxval As %Integer = 2) As %Integer [ SqlName = RANDOM, SqlProc ]
{
 quit $random(maxval)
} }

Assuming your table has defautl ID (%Integer, MINVAL=1)

SELECT TOP 1  column FROM table
HAVING ID >= RANDOM(MAX(ID))

>= ensures that you just get an existing ID and don't drop on a deleted one

Of course, if you know in advance the highest existing ID   (e.g. maxid)  then RANDOM(maxid)  will do it.

Extending the reply of  @Vitaliy.Serdtsev 
Basically whatever your variable holds could be a %String  (also including binary values)
COS has a few check functions to interpret the content 

Further on the Pattern Match operator ?  let you sort out pure text and binary, .....

All you have is just content. It is left up to you to decide what type it is.
You can find out by those functions what is NOT.

Only the data type classes decide to some limit what type it should be.

NO it is not possible:
In IRIS for Windows (x86-64) 2020.1 (Build 215U) it is compiled.
But at run time you get an SQLCODE=1 and an error message for a bad SQL statement. 
Better compose an SQL string  "SELECT name FROM "_table and process it with some ResultSet class, 

The embedded code in the class we know from Cache is gone.
It all generates into  a %scqlc.* class

 

In principle I'd share te suggestion of @Stephen Canzano;

with 2 minor additions: SELECT Count(ID) from <youtable>  will you always lead to the
explicit or implicit Extent Index.  (bitmap or standard)

set cls=##class(%Dictionary.CompiledClass).%OpenId("classname")
set table=clsSqlTableName

This is important as there are a bunch of classes that have explicit defined table names.

In addition, it works also for table linked over SQL gateway
 

[SQLCODE: <-131>:<After Insert trigger failed>]

  [%msg: <21003,Cannot INSERT "NIActivityCode" because number is already used.>]

this simply means that you try to insert something that is unique and already present.
 so check against your table definition for uniqueness and next the data you want to insert.

Start with ID first.

It is definitely a data issue and not related to syntax

INSERT INTO ccms.NIActivityCode (ID, CustID, ActivityCode, Name, ShortName, CreateDate, Type, Server)
SELECT '1||1||102', '1', '102', 'Test1', 'test1', '2020-01-01 10:37:00', '4', '1'
UNION ALL
SELECT '1||1||103', '1', '103', 'Test2', 'test2', '2020-01-01 10:37:00', '4', '1'
UNION ALL
SELECT '1||1||104', '1', '104', 'Test3', 'test3', '2020-01-01 10:37:00', '4', '1'
UNION ALL

UNION ALL adds to the previous Select.

ALL means all columns