2016-07-21 6 views
1

Ich habe eine Dockerfile wie:Docker Bild Einspeisepunkt Script nicht gefunden

FROM frolvlad/alpine-oraclejdk8:slim 
ADD build/libs/zuul*.jar /app.jar 
ADD src/main/script/startup.sh /startup.sh 
EXPOSE 8080 8999 
ENTRYPOINT ["/startup.sh"] 

startup.sh wie folgt aussieht:

#!/bin/sh 
set -e 

if [ $# -eq 0 ] 
then 
    echo "Environment value required" 
    exit 1 
fi 

java -jar -Xms400m -Xmx400m -Dlog4j.configurationFile=log4j2-qa2.xml -Djava.security.egd=file:/dev/./urandom -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.rmi.port=8999 app.jar 

Aber wenn ich es mit docker run laufen, ich habe docker: Error response from daemon: Container command '/startup.sh' not found or does not exist... Das Shell-Skript hat Ausführungsberechtigung.

habe ich die gleiche Art und Weise meine anderen Anwendungen zu laufen und sie sind alle gut funktioniert. Ich schrieb die Dateien in Mac und versuchte, den Container in einem Linux-Rechner auszuführen.

Antwort

2

Es stellt sich heraus die ^M DOS-Zeilenendezeichen sein, die das Problem verursacht. Aber da ich auf dem Mac bearbeite und ich mehrmals mit vim nachgesehen habe, bin ich ziemlich sicher, dass das Startskript auf meinem lokalen Rechner dieses Zeichen nicht hat. Aber wenn ich mit vim innerhalb des Containers geöffnet habe, kann ich ^M überall sehen. Also irgendwie wird dieser Char startup.sh hinzugefügt, wenn in das Bild kopiert, was seltsam ist. Dies verhindert, dass das Skript aufgerufen wird.

Die Lösung ist dos2unix filename vor dem ENTRYPOINT in Dockerfile hinzuzufügen. Stellen Sie jedoch sicher, dass Ihr Basisimage über dieses Dienstprogramm verfügt.

+1

Hah schön, danke, dass du der Community von deinen Ergebnissen erzählt hast. Es lohnt sich auf jeden Fall, sich über diese Seltsamkeit zu informieren. Sowieso. Gut zu wissen, dass Sie Ihr Problem gelöst haben. + 1 –

0

Ich denke, das Problem hier ist, wenn Sie Pfad wie /app.jar angeben, ist es wirklich schwierig zu erkennen, wo die current working directory tatsächlich ist.

Es kann sein, wo und ich vermute, Docker muss versehentlich Ihre start.sh an einem Ort, was auch immer an diesem Punkt ./ ist.

Sie könnten ssh in den Container und tun Sie eine find zu suchen und zu sehen, wo startup.sh sitzt.

  1. docker ps -a - Finden Docker Container ID
  2. docker -i -t [CONTAINER_ID] /bin/bash - SSH innerhalb
  3. find . -name "startup.sh" - für Datei suchen.

Wenn Sie beabsichtigen, die Dateien durch Verwendung ./ (aktuelles Arbeitsverzeichnis) zu kopieren, ich denke, es wäre besser, zu spezifizieren, wo current ist. Und Sie können dies mit dem Schlüsselwort WORKDIR tun.

Beispiel: WORKDIR /path/to/workdir

Die WORKDIR Befehl setzt das Arbeitsverzeichnis für jede RUN, CMD, ENTRYPOINT, COPY und Anweisungen hinzufügen, die es folgen in die Dockerdatei. Wenn das WORKDIR nicht vorhanden ist, wird es erstellt, selbst wenn es in keiner nachfolgenden Dockerfile-Anweisung verwandt wird.

Auf diese Weise wird Docker nicht verwirrt werden.

Siehe: https://docs.docker.com/engine/reference/builder/#/workdir

+0

Es scheint, dass ich nicht in einen gestoppten Container ssh kann. Und weil es die 'startup.sh' nicht finden kann, kann der Container nicht gestartet werden. –

+0

Hilft es beim Einstellen von WORKDIR, die 'startup.sh' zu finden? Es lohnt sich auch @VonC 's Lösung zu versuchen –

+0

Ich habe beides versucht. Ich habe 'WORKDIR /' ganz am Anfang gesetzt, aber es funktioniert immer noch nicht. –

1

Das Shell-Skript die Berechtigung hat auszuführen. obwohl

Sind Sie sicher?(Ich meine innerhalb der Behälter, onced hinzugefügt)
Um sicher zu gehen, würde ich die Dockerfile verwenden:

EXPOSE 8080 8999 
COPY src/main/script/startup.sh /startup.sh 
RUN chmod 755 /startup.sh 
WORKDIR/
ENTRYPOINT ["/startup.sh"] 
+1

Ich habe '/ bin/sh: CHMOD: nicht gefunden Der Befehl '/ bin/sh -c CHMOD 755 /startup.sh' hat einen Code ungleich null zurückgegeben: 127' –

+0

Es ist tatsächlich Kleinschreibung' chmod'. Aber ich bekomme immer noch den gleichen Fehler. –

1

Ein Behälter wird beendet, wenn seine Hauptprozess beendet. Überprüfen Sie also, ob /startup.sh nicht endet.

Besonders überprüfen, dass diese Java

java -jar -Xms400m -Xmx400m -Dlog4j.configurationFile=log4j2-qa2.xml \ 
    -Djava.security.egd=file:/dev/./urandom \ 
    -Dcom.sun.management.jmxremote \ 
    -Dcom.sun.management.jmxremote.port=8999 \ 
    -Dcom.sun.management.jmxremote.local.only=false \ 
    -Dcom.sun.management.jmxremote.rmi.port=8999 \ 
    app.jar 
+0

Was meinst du? Du meinst das '/ startup.sh' ist nicht richtig geschrieben? –

+0

Es scheint das Problem der Zeilenenden zu sein. Ich sehe '^ M' am Ende jeder Zeile, als ich im Container war. Ich öffnete es mit 'vim' im Container. Ich habe diese Zeichen gelöscht und kann sie ausführen. Aber außerhalb des Containers kann ich diese Zeichen nicht mit 'vim' sehen. Ich habe gerade geschnitten und all die Sachen in Mac, ich sollte diese Zeichen nicht bekommen. Irgendeine Idee? –

+0

http://vim.wikia.com/wiki/File_format –