Las dos cosas que te faltan aquí son:
docker exec... <command>
no ejecuta <command>
en un shell de forma predeterminada, solo ejecuta <command>
en el contenedor sin shell.
Si desea ejecutar un comando en la ventana acoplable en un shell interactivo no -, utilice:
docker exec <container> bash -c '<command>'
Si <command>
tiene más de una palabra, debe estar entre comillas simples -o dobles -para que el comando completo se pase a bash -c
.
por ej.sudo docker exec 2543e7235fa9 bash -c 'echo $XYZ'
Cuando haces eso, hay dos caparazones que importan:
sudo docker exec...
en (llámelo "Shell A")
Si no barra invertida -escape o cita -$
en el shell A, entonces el shell A interpolará su propio valor para$XYZ
(incluso si no lo hace tener uno, que devuelve una cadena vacía ).
Entonces, si XYZ=5
en Shell A, entonces su sudo docker exec 2543e7235fa9 echo $XYZ
es lo mismo queexec 2543e7235fa9 echo 5
(y no habría Shell B porque no le dijo a Docker que ejecutarabash -c...
).
Si realiza escape o -comilla simple $
, entonces se pasa al shell B como -, y el shell B interpola su valor para $XYZ
.
En otras palabras, utilice:
sudo docker exec 2543e7235fa9 bash -c 'echo $XYZ'
o
sudo docker exec 2543e7235fa9 bash -c "echo \$XYZ"
El formulario único -citado es, en mi opinión, más fácil de entender lo que está haciendo y lo que debe usar la mayor parte del tiempo. No ocurre ninguna interpolación de variables dentro de comillas simples -, por lo que el comando se pasa exactamente como está al shell B.
La forma de comillas dobles -es útil cuando necesita pasar variables del shell A al shell B. Si también necesita pasar un literal $
entonces debe tener una barra invertida -con escape. p.ej.para hacer que el shell B haga eco del shell A $ABC
y el suyo propio$XYZ
:
sudo docker exec 2543e7235fa9 bash -c "echo $ABC \$XYZ"
Si el shell A $ABC
es igual a 10
y el shell B $XYZ
es igual a 123, entonces generaría:
10 123
Tenga en cuenta :a menos que $XYZ
esté definido en uno de los archivos de inicio de shell B, o con docker run -e XYZ=123
como usó en su ejemplo (o con -env-file
), no tendrá un valor.
Не совсем.
Это, конечно, нельзя сделать переносным способом. Вы не указали, в какой системе вы пытаетесь это сделать. Я предполагаю, что это Linux, так как это то, что я знаю лучше всего, но не стесняйтесь уточнить.
Ядро Linux имеет два системных вызова, связанных с «сходством процессора», sched_setaffinity ()
и sched_getaffinity ()
. Их можно использовать, чтобы сообщить ядру, на каких ядрах процесс может запускаться. Если количество процессоров меньше, чем количество потоков, которые процесс в настоящее время использует, то по необходимости он начнет использовать меньше ядер. Однако проблема с этим методом заключается в том, что он заставляет определенный набор ядер ЦП для запуска процесса. Если это работа с интенсивным использованием ЦП, то это означает, что эти ядра могут нагреваться; если система не имеет достаточного охлаждения для охлаждения процессора, чтобы это было менее проблематично, то обычно решение заключается в том, что ядро перенастраивает рассматриваемый процесс на другое ядро, позволяя тому, которое только что использовалось для охлаждения немного тем временем. При принудительном запуске набора ядер этот метод больше не работает, и вместо этого ядру придется вернуться к изменению частоты процессора. Однако, если вы пытаетесь ограничить количество ядер, потому что есть и другие процессы, которым вы хотите выделить некоторое время ЦП, то это, вероятно, не имеет большого значения.
К системным вызовам sched_setaffinity ()
и sched_getaffinity ()
можно получить доступ из командной строки с помощью команды taskset
:
taskset -p 0x3 $PID
сообщит ядру что процесс с pid $ PID
с этого момента может выполняться только на ядрах процессора 0 и 1. (0x3 - это битовая маска, где бит 1 относится к ядру 0, а бит 2 относится к ядру 1).
Маска сродства является двоичной и вводится как шестнадцатеричное число, вы можете указать, какие ЦП использовать, используя полную таблицу для четырехъядерного процессора ниже:
0x1 - cpu0
0x2 - cpu1
0x3 - cpu0 and cpu1
0x4 - cpu2
0x5 - cpu0 and cpu2
0x6 - cpu1 and cpu2
0x7 - cpu0, cpu1 and cpu2
0x8 - cpu3
0x9 - cpu0 and cpu3
0xA - cpu1 and cpu3
0xB - cpu0, cpu1 and cpu3
0xC - cpu2 and cpu3
0xD - cpu0, cpu2 and cpu3
0xE - cpu1, cpu2 and cpu3
0xF - cpu0, cpu1, cpu2 and cpu3