2016-05-18 10 views
-1

Ich habe ein einfaches Docker-Image erstellt, das zum Erstellen eines Schlüsselpaars mit openssl verwendet werden kann. Aber wenn ich den Container docker run, erzeugt es eine Schlüsseldatei mit der Länge Null. Wenn Sie den Befehl openssl interaktiv ausführen, wird jedoch eine normal große Schlüsseldatei erstellt. Warum speichert das Ausführen über einen Docker-Container den Inhalt der Datei nicht?Warum produziert dieser Docker CMD eine Datei mit der Länge Null?

Mein Dockerfile sieht wie folgt aus:

# Very small Docker image that provides openssl 
# 
FROM gliderlabs/alpine:3.3 
MAINTAINER Dave Hein <[email protected]> 

ARG REFRESHED_AT=2016-05-17T18:29-0500 
RUN apk-install --update openssl 
RUN apk-install --update expect 
WORKDIR /data/root/ca 

ARG CMD_AT=2016-05-17T19:42-0500 
CMD mkdir -p certs crl newcerts private && \ 
    expect -c "spawn openssl genrsa -aes256 -out private/${KEY_NAME}.key.pem 4096" \ 
    -c "expect \"Enter pass phrase\"" \ 
    -c "send \"${PP_}\r\"" \ 
    -c "expect \"Verifying - Enter pass phrase\"" \ 
    -c "send \"${PP_}\r\"" \ 
    -c "interact" && \ 
    echo 

ich den Behälter mit diesem Skript bauen:

#! /bin/bash 
# 
docker build -t datihein/ca-cert --file Dockerfile . 

Und das Skript, das den Behälter läuft wie folgt aussieht:

#! /bin/bash 
# 
docker run --rm \ 
    -e KEY_NAME=datihein -e PP_="wat dat?!" \ 
    -v /var/lib/dockerdata/root/ca:/data/root/ca \ 
    datihein/ca-cert 

Ich habe versucht, sync undhinzuzufügenan die CMD, vor der echo, aber ich am Ende noch mit einer Null-Datei in /var/lib/dockerdata/root/ca/private/datihein.key.pem auf dem Host.

Ich vermute, das Problem hat etwas mit dem Laichen innerhalb von expect zu tun, aber ich weiß nicht, was zu tun ist, um die Datei zu ersticken, bevor der Container abgerissen wird.

(Bei wichtig es ist, ist mein Docker Host-System ein boot2docker auf einem OS X 10.9.5 System in VirtualBox VM ausgeführt wird.)

UPDATE: Die Lösung der Befehl erwarten verwenden war wait Warten Sie, bis der Prozess openssl beendet wird, bevor Sie den Befehl expect abschließen und den Container löschen. Der aktualisierte Docker CMD sieht so aus:

CMD mkdir -p certs crl newcerts private && \ 
    expect -c "spawn openssl genrsa -aes256 -out private/${KEY_NAME}.key.pem 4096" \ 
    -c "expect \"Enter pass phrase\"" \ 
    -c "send \"${PP_}\r\"" \ 
    -c "expect \"Verifying - Enter pass phrase\"" \ 
    -c "send \"${PP_}\r\"" \ 
    -c "wait" && \ 
    echo 

Antwort

0

Ich fand die Lösung. Es war in der Tat mit dem spawn Befehl innerhalb expect verwandt.

Der expect Befehl wait wartet auf den Abschluss eines erstellten Prozesses.

Ich ersetzte einfach den interact Befehl mit wait und es erzeugte eine Schlüsseldatei normaler Länge; d. h. der Befehl openssl löschte die Ausgabedatei und schloss sie, bevor der Container zerstört wurde.

(Feh. Vielleicht wird dies jemand anderes helfen.)