Goвно / Говнокод #27261 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 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 Fike, (Updated )

Комментарии (42) RSS

  • што будет, если написат "GO=V=NO"? excve упадет?

    кстати, пинда тоже блок переменных строкой принимает
    Ответить
    • Да нет, его задача -- доставить эти строчки до запускаемой проги as is. Да и там парсер скорее всего разберёт это как переменную "GO" со значением "V=NO".
      Ответить
      • типа оно лежит в памяти программы блоком , а getenv в юзермоде это парсит?
        Ответить
          • понятно

            у винды это где-то в PEBе лежит вроде, у прыща не знаю как называется, PCB небось?. Но видно тут
            $ cat /proc/$$/environ
            Ответить
            • Это кстати стартовое окружение, putenv/setenv его не трогают вроде.
              Ответить
              • ну докер же небось новый процесс родит, так что он наследует
                Ответить
                • Видимо в момент exec'а они скукоживаются обратно в один блок и сохраняются, в отличие от остальных страничек.
                  Ответить
                  • не осилил распарсить твою фразу

                    ты имел ввиду, что остальные странички ведут себя как корова, а именно этот блок честно копируется?
                    Ответить
                    • > как корова

                      Большинство старых страничек тупо дропается. Мы же про exec, а не про fork.
                      Ответить
                      • а, тфу, я иблан. exec же поверх загружает.
                        а дескрипторы он не наследует разве? А терминал?
                        наследует же


                        Вообще обычно же делают 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("GO"); // "V=NO"
          getenv("GO=V"); // "NO"
          Т.е. это даже не парсинг, просто поиск префикса. Видимо поэтому мапа тут и не катит.
          Ответить
  • Fike, тебе бы по-проще слова использовать и по-понятнее выражаться.
    Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8