/ / Starting Golang Webserver in einem Dockercontainer - bash, ubuntu, go

Starten von Golang-Webserver in einem Docker Container - bash, ubuntu, go

Ich bin dabei, einen Dienst zu erstellen, der es Benutzern ermöglicht, einen Golang-Webserver nach Belieben zu starten / stoppen. Um einen Nodejs Server unter ähnlichen Umständen laufen zu lassen, gebe ich einfach ein nodejs /path/to/index.js &disown innerhalb einer Batch-Datei, die ich beim Start des Containers ausführe. Die wesentlichen Bits

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"]

Dies funktioniert jedes Mal perfekt. Im gorun.sh ich habe nodejs /path/to/index.js & disown Linie.

Jetzt, da ich versuche, einen Golang-Webserver unter ähnlichen Bedingungen zu betreiben, dachte ich, ich würde den gleichen Ansatz versuchen. Ich habe das Skript gorun.sh modifiziert, um es zu lesen

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

Nun, hier ist das Seltsame. Ich habe versucht, den Go-Server auf zwei Arten zu starten

  • Rein als Experiment habe ich den Docker Container mit einem angeschlossenen Terminal gestartet gorun vom Terminal aus. Der Golang-Server schoss sofort los und alles war hunkry-dory.
  • Um besser nachzuahmen, wie die Dinge im wirklichen Leben funktionierenworld - Ich habe eine Datei, startgo.txt, an einem vorher festgelegten Ort abgelegt, die dann von einem CRON-Job abgeholt wird, der gorun aufruft. Diesmal keine Freude - der Server startet nicht.

Warum nicht einfach anrufen? go run /path/to/index.go & disown aus dem Startskript des Docker-Containers? Versucht, das gleiche Ergebnis: Der Server startet nicht.

Es ist mir nicht klar, was hier passiert. Warum wird der Nodejs-Server hochgefahren, während der Golang-Server einen leeren Platz verweigert? Warum wird es gestartet, wenn ich dasselbe Skript von einem Terminal aus laufe? Ich würde jede Hilfe bei diesen Problemen sehr zu schätzen wissen.

Antworten:

-3 für die Antwort № 1

Diese Ausgabe hat mich mit drohendem Abhang um die Ecke getriebenDeadlines und es dauerte eine ganze 24 Stunden um herauszufinden, was los war. Das Problem ist eher subtil. Also hier ist eine Erklärung für den Vorteil von jedem, der in diesen Thread läuft.

Nie vergessen: Damit Golang seine Magie ausstrahlen kann, muss das OSin der Lage sein, es zu finden. Geben Sie die Umgebungsvariable $ GOPATH ein. Wenn Sie so etwas wie ich sind, werden Sie Anweisungen im Internet folgen, wie Sie dies tun. Ich folgte den Anweisungen in dieser Beitrag auf Vultr. Der Kern dessen, was sie vorschlagen

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

Hervorragende Anweisungen - danke Vultr.

Die Schlüsselausgabe

Wie ich in meiner ursprünglichen Frage erwähnt habe, was mich verwirrt hat war, dass ich die Batch-Datei ausgeführt habe gorun enthalten

go run /path/to/index.go &

von einer Terminalsitzung, die an die Docker-Sitzung angeschlossen war, funktionierte es. Als ich jedoch versuchte, es von einem Bash-Skript auszuführen, das zu Beginn der Docker-Sitzung ausgeführt wurde, tat es das nicht.

Wenn du ein bisschen darüber nachdenkst und siehst, was in den Vultr-Anweisungen oben passiert, ist alles offensichtlich. Die Pfadvariablen werden festgelegt NUR WENN EIN INTERAKTIVES TERMINAL GEÖFFNET IST! - d. h. NICHT, wenn Sie versuchen, a auszuführen go dosomething Anweisung aus einer alten Batch-Datei - zum Beispiel die, die Sie ausführen, wenn der Docker-Container gestartet wird.

Wenn Sie möchten, dass Golang korrekt innerhalb eines Docker-Containers funktioniert, ganz oben im Bash-Skript, das Sie beim Start des Containers ausführen, müssen Sie das Problem beheben

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