Стартиране на уеб сървъра на. В контейнера на Dockercontainer - bash, Ubuntu, отидете

Аз съм в процес на създаване на услуга, която, наред с други неща, позволява на потребителите да стартират / спират уеб сървър на Golang по желание. За да получите сървър на Nodejs, работещ при подобни обстоятелства, просто издавам a nodejs /path/to/index.js &disown от рамките на партиден файл, който се изпълнява при стартирането на контейнера. Основните битове

ADD gorun.sh /usr/local/bin/gorun.sh
RUN chmod +x /usr/local/bin/gorun.sh

...
ENTRYPOINT ["/bin/bash"]
CMD ["/usr/local/bin/gorun.sh"]

Това работи перфектно всеки път. в gorun.sh имам nodejs /path/to/index.js & disown линия.

Сега, когато се опитвам да намеря уеб сървър на Golang, който работи при подобни условия, си помислих, че ще опитам същия подход. Промених скрипта gorun.sh, за да прочета

#! /bin/bash
go run /path/to/index.go & disown;
ps aux | grep go

Сега е странното нещо. Опитах се да стартирам Go сървъра по два начина

  • Чисто като експеримент започнах контейнера на Docker с терминал, прикачен на повикването gorun от терминала. Сървърът на Голанг веднага изстреля всичко и всичко беше опустошено.
  • За да подражавате по-добре на начина, по който нещата работят в реалносттасвят - поставих файл, startgo.txt, на предварително определено местоположение, което след това се вдига от задача CRON, която нарича Горун. Този път, няма радост - сървърът не започва.

Защо просто не се обадете? go run /path/to/index.go & disown от скрипта за стартиране на контейнера на Docker? Също така се опитах - същия резултат: сървърът не стартира.

Не ми е ясно какво се случва тук. Защо сървърът на Nodejs се запалва, докато сървърът на golang отказва точка празно? Защо се задейства, ако изпълня същия скрипт от терминал? Много ще оценя всяка помощ по тези въпроси.

Отговори:

-3 за отговор № 1

Този въпрос ме накара да избягамкрайни срокове и ми отне цяла 24 часа, за да разбера какво се случва. Проблемът е доста тънък. Така че тук е обяснение за ползата от всеки, който работи в тази нишка.

Никога не забравяйте: За Golang да достави магията си OS трябва дада може да го намери. Въведете променливата на средата $ GOPATH. Ако сте нещо като мен, ще сте следвали инструкции някъде в мрежата как да направите това. Следвах инструкциите в тази публикация на Vultr. Същността на това, което те предлагат

echo export GOPATH=/opt/gopkg >> ~/.bashrc
echo export GOROOT=/opt/go >> ~/.bashrc
echo export PATH=$PATH:$GOROOT/bin:$GOPATH/bin >> ~/.bashrc

Отлични инструкции - благодаря ви Vultr.

Ключовият опит

Както споменах в оригиналния си въпрос, какво ме озадачи, когато изпълних партидния файл gorun съдържащ

go run /path/to/index.go &

от сесия на терминала, приложена към сесията на Докер, която работи. Обаче, когато се опитах да го изпълня от скрипт bash, изпълнен в началото на сесията на Docker, не го направи.

Когато мислите за това малко и погледнете какво се случва в инструкциите на Vultr по-горе, всичко е заслепено очевидно. Промените в пътя се задават САМО ЗА ОТКРИВАНЕ НА ИНТЕРАКТИВЕН ТЕРМИНАЛ! - т.е. НЕ, когато се опитвате да изпълните go dosomething инструкция от който и да е стар партиден файл - например този, който стартирате при стартирането на контейнера Docker.

Ако искате да имате Golang да работи правилно от контейнера Docker в горната част на скрипта bash, който се изпълнява при стартиране на контейнера, ще трябва да го издадете

export GOPATH="/opt/gopkg";
export GOROOT="/opt/go";
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin;