Often logging libraries allow you changing the logging level at runtime, without restarting or recompiling the application, as well as turning logs or off at runtime for different parts of the application. They let you organize logging levels so that when, for example, you turn the level to INFO in one part of the applications, all of the connected code also gets its own log level turned to INFO and you can define which parts of the application should change their log levels in sync. There's also performance considerations, often log libraries claim to implement tricks so that logging is supposed to be faster than naively writing strings to a file.
My impression is that in China it varies a lot by industry and location. Even in Shanghai, I've come across offices closing at 4PM with a 2 hours lunch break.
Docker images package the entire environment that an application needs to run, but to do that they contain precompiled software for a specific CPU architecture, so they can't help you jump across architectures. Not even a full VM allows that by itself, for running software for a different architecture you need emulation.
One issue is that your comment sounds a bit hyperbolic. For example, China criminalizes thought? It certainly does not criminalize thought as such.
About 'working together with our allies'... Some will argue the 'West' has developed a somewhat abusive relationship with a lot of the world over the last two hundred years. It's not surprising some would look favourably to a competitor, if only to take advantage of that competition to make a better deal for themselves.
Finally, if other parts of the world develop a more advanced IT industry instead of China, how does that preserve Western developers salaries? Are the Chinese uniquely inclined to work long hours for low salaries? Or are you implying that the 'West' would need to prevent nations under 'our sphere of influence' to develop an IT industry so developers in the 'West' can continue to receive their current salaries?
I believe an example of where binding differs from assignment is if you define a function which references a binding in the outer scope, the create a new binding with the same name in the outer scope, the value inside the function does not change:
a = 1
f = fn -> a end
f.() # returns 1
a = 2
f.() # still returns 1