2017-06-12 1 views
0

Ich verbrachte das Wochenende damit, über die Docker-Dokumentation zu streunen und mit den Spielzeuganwendungen und Beispielprojekten herumzuspielen. Ich versuche jetzt, einen sehr einfachen Web-Service zu schreiben und ihn aus einem Container heraus zu starten. In dem Behälter, möchte ich meine app (a Frühling Boot-App unter der Haube) - genannt bootup - die folgende Verzeichnisstruktur haben:Meine App kann keine Protokolldateien erstellen, wenn sie in Docker gestartet wird

/opt/ 
    bootup/ 
     bin/ 
      bootup.jar  ==> the app 
     logs/ 
      bootup.log  ==> log file; GETS CREATED BY THE APP @ STARTUP 
     config/ 
      application.yml ==> app config file 
      logback.groovy ==> log config file 

Es ist sehr wichtig zu beachten, dass, wenn ich betreibe meine App lokal auf meinem Host-Rechner - außerhalb von Docker - alles funktioniert einwandfrei, einschließlich der Erstellung von Protokolldateien zu meinem Host /opt/bootup/logs Verzeichnis. Die Endpunkte der App liefern den richtigen Inhalt usw. Alles ist gut und schön.

Also habe ich die folgende Dockerfile:

FROM openjdk:8 

RUN mkdir /opt/bootup 
RUN mkdir /opt/bootup/logs 
RUN mkdir /opt/bootup/config 
RUN mkdir /opt/bootup/bin 

ADD build/libs/bootup.jar /opt/bootup/bin 
ADD application.yml /opt/bootup/config 
ADD logback.groovy /opt/bootup/config 

WORKDIR /opt/bootup/bin 

EXPOSE 9200 

ENTRYPOINT java -Dspring.config=/opt/bootup/config -jar bootup.jar 

ich dann über mein Bild bauen:

docker build -t bootup . 

ich dann mein Container laufen:

docker run -it -p 9200:9200 -d --name bootup bootup 

Ich betreibe docker ps:

CONTAINER ID  IMAGE    COMMAND ... 
3f1492790397  bootup    "/bin/sh -c 'java ..." 

So weit, so gut!

Meine App sollte dann eine einfache Webseite unter localhost:9200 dienen, also öffne ich meinen Browser zu http://localhost:9200 und ich bekomme nichts.

Wenn ich docker exec -it 3f1492790397 bash in meinen Container „ssh“, ich sehe alles gut aussieht, außer das /opt/bootup/logs Verzeichnis, das eine bootup.log Datei in ihm haben sollte - beim Start erstellt - ist stattdessen leer.

Ich versuchte docker attach 3f1492790397 und anschließend http://localhost:9200 in meinem Browser schlagen, um zu sehen, ob das würde einige Standardausgabe (mein App meldet ich sowohl /opt/bootup/logs/bootup.log sowie die Konsole) erzeugt, aber das ergibt keine Ausgabe.

Also ich denke, was passiert ist, dass meine App (aus irgendeinem Grund) keine Berechtigung zum Erstellen einer eigenen Protokolldatei, wenn der Container startet, und setzt die App in einem seltsamen Zustand, oder sogar verhindert es von Anfang an zusammen. So

Ich frage:

  • Gibt es eine Möglichkeit zu sehen, welche Benutzer meine Anwendung wird gestartet als ?; oder
  • Gibt es eine Möglichkeit, Standard-Ausgabe zu beenden, während der Container gestartet wird? helfen Sie mir nach der Inbetriebnahme Anbringen nicht, weil ich durch die Zeit denken, betreibe ich den docker attach Befehl die App bereits

Vielen Dank im Voraus gewürgt hat!

+0

Wenn Sie 'docker run -it image' ausführen, fügen Sie standardmäßig stdout/stderr hinzu. Über das Problem der App, haben Sie überprüft, ob die App permisson in diesen Ordner schreiben? – German

+0

Ich habe ein Projekt erstellt, um zu überprüfen, ob Sie ein Berechtigungsproblem hatten, aber nein. Alles deutet darauf hin, dass Sie ein Problem in der Anwendung haben. Ich verlasse das Beispiel in: https://github.com/nitzap/so-java-docker-log – German

Antwort

1

Ich weiß nicht, warum Ihre Anwendung nicht funktioniert, kann aber Ihre Fragen-

Gibt es eine Möglichkeit beantworten, um zu sehen, welche Benutzer meine Anwendung als Anfahren wird ?; oder

A: Docker-Container werden als Root ausgeführt, sofern nicht anders angegeben.

Gibt es eine Möglichkeit, die Standardausgabe zu beenden, während der Container gestartet wird? helfen Sie mir nach der Inbetriebnahme Anbringen nicht, weil ich durch die Zeit denken, betreibe ich den Docker anhängen Befehl die App bereits

A gedrosselt hat: dump Docker-Container stdout/stderr auf die Docker Protokolle standardmäßig. Es gibt zwei Möglichkeiten, dies zu sehen: 1 Den Container mit dem Flag -it anstelle von -d auszuführen, um eine interaktive Sitzung zu erhalten, in der das stdout aus Ihrem Container aufgelistet wird. Die andere Möglichkeit besteht darin, den Befehl docker logs *container_name* für einen laufenden oder gestoppten Container zu verwenden.

Docker befestigen 3f1492790397

Dies nicht tun, was Sie für hoffen. Was Sie wollen, ist docker exec (wahrscheinlich docker exec -it bootup bash), die Ihnen eine Shell im Bereich des Containers geben wird, mit der Sie nach Ihren Log-Dateien suchen oder versuchen können, die App mit curl aus dem Container zu treffen.

Warum bekomme ich keine Ausgabe?

Schwer zu sagen, ohne die Informationen aus den früheren Befehlen. Hört Ihre App auf 0.0.0.0 oder auf localhost zu (Ihr Laptop-Browser wird wie eine externe Maschine für den Container aussehen)? Benötigt Ihre App einen Supervisor-Prozess, der nicht ausgeführt wird? Benötigt es einige andere JAR-Dateien, die sich auf dem CLASSPATH auf Ihrem Laptop, aber nicht im Container befinden? Führen Sie Docker mit Docker-Machine aus (in diesem Fall ist localhost wahrscheinlich nicht der Name des Containers)?

Verwandte Themen