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