我創建了一個簡單的Docker鏡像,可用於使用openssl創建密鑰對。但是,當我docker run
容器,它產生一個零長度的密鑰文件。然而,以交互方式運行openssl
命令會產生一個正常大小的密鑰文件。 爲什麼通過Docker容器運行不保存文件的內容?爲什麼這個Docker CMD產生一個零長度的文件?
我Dockerfile
看起來是這樣的:
# 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
我打造的容器使用此腳本:
#! /bin/bash
#
docker build -t datihein/ca-cert --file Dockerfile .
而且運行容器中的腳本是這樣的:
#! /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
我試過加sync
和sync -f
到CMD,在echo
之前,但我仍然在主機上以/var/lib/dockerdata/root/ca/private/datihein.key.pem
結束了零長度文件。
我懷疑這個問題與expect
內產卵有關,但我不知道該如何強制在容器被拆卸之前刷新文件。
(如果它是很重要的,我多克爾主機系統是一個boot2docker VM在VirtualBox中運行OS X 10.9.5系統上。)
UPDATE:的解決方案是使用期望命令wait
在完成expect
命令並銷燬容器之前等待openssl
進程終止。更新的Docker CMD看起來像:
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