2016-05-18 53 views
-1

我創建了一個簡單的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 

我試過加syncsync -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 

回答

0

我找到了解決方案。這確實與expect中的spawn命令有關。

expect命令wait將等待產生的過程完成。

我簡單地用wait替換了interact命令,它產生了一個正常長度的密鑰文件;即在容器被銷燬之前,openssl命令刷新並關閉輸出文件。

(FEH,或許這將幫助別人。)

相關問題