+1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
// https://docs.docker.com/engine/api/v1.24/#create-a-container
POST /v1.24/containers/create HTTP/1.1
Content-Type: application/json
Content-Length: 12345
{
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"FOO=bar",
"BAZ=quux"
],
...
}
Ядро предоставляет сисколл execve. Execve принимает переменные окружения в виде массива строк A=B -
не знаю конкретных причин, почему так сделано, но скорее всего просто потому что писать хэшмапу под
это дело, которая еще и будет выкинута из памяти через относительно небольшое время - дело дорогое и
ненужное, плюс наверняка какой-нибудь лишний пердолинг со стеком.
https://man7.org/linux/man-pages/man2/execve.2.html
Го, "человеческий язык" с поддержкой обычных мап из коробки, ничтоже сумляшеся не замечает никакой
проблемы и заставляет пользователя передавать переменные окружения в том же формате, потому что у
языка не только синтаксис должен быть таким же тупым, как программист на нём и вообще мы же тут
делаем вид, что мы C, только лучше.
https://golang.org/pkg/os/exec/#example_Command_environment
Докер, "человеческий сервис" с HTTP API, использующим формат JSON с поддержкой обычных мап из коробки,
ничтоже сумляшеся не замечает никакой проблемы и заставляет пользователя передавать переменные
окружения в том же формате, потому что на программист на языке должен быть тупым, как этот язык.
https://docs.docker.com/engine/api/v1.24/#create-a-container
В результате мы имеем пачку долбоебов, из-за которых оперирующие (мапами / объектами / словарями / как угодно назовите)
нормальные люди должны вести себя как типичные гошники.
Запостил:
Fike,
17 Февраля 2021
кстати, пинда тоже блок переменных строкой принимает
у винды это где-то в PEBе лежит вроде, у прыща не знаю как называется, PCB небось?. Но видно тут
ты имел ввиду, что остальные странички ведут себя как корова, а именно этот блок честно копируется?
Большинство старых страничек тупо дропается. Мы же про exec, а не про fork.
а дескрипторы он не наследует разве? А терминал?
наследует же
Вообще обычно же делают fork, а потом exec, иначе ты сам себя заместишь, не завезли же NTшный CreateProcess
Это же просто циферки... Я так понимаю, в юзермодной части о них вообще ничего нет.
> терминал
Обычный дескриптор, не?
Есть некоторая память, связанная с процессом.
Ну да, эта память скорее всего ядерная, юзермоду не доступная.
Но она же тоже копируется (точнее, не удаляется)
stdout (циферка) указывает же на тот же самый tty, например
execve замещает процесс with newly initialized stack, heap, and (initialized and uninitialized) data segments.
но!
By default, file descriptors remain open across an execve().
но !
File descriptors that are marked close-on-exec are closed;
так что файл может и закрыться, смотря как откроешь
ps: вектор (строку) с переменными можно явно передать, а если не передать, то онаскоприуется из переменной "environ" (глобальная позикс переменная с окружением)
А есть, кстати, проги которые это абузят для горячего апдейта. Скидываешь данные в шаред мемори, обновляешь код exec'ом, а все сокеты да пайпы у тебя остаются унаследованы и связь с клиентами не прерывается.
> getenv("SH")
Найди 10 отличий? Не понял твой вопрос.
я опечатался
збс.
итого, в линуксе есть /etc/profile, /etc/bash.bashrc (для интерактивных логинов) и блядь /etc/enviroment какой-то
походу да, лол.
bugs be bad
me bugs fixed
me guhd
обии