Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Docker CMD生成的文件长度为零?_Docker_Containers_Expect - Fatal编程技术网

为什么Docker CMD生成的文件长度为零?

为什么Docker CMD生成的文件长度为零?,docker,containers,expect,Docker,Containers,Expect,我创建了一个简单的Docker映像,可用于使用openssl创建密钥对。但是当我运行容器时,它会生成一个零长度的密钥文件。然而,以交互方式运行openssl命令会生成一个正常大小的密钥文件为什么通过Docker容器运行不会保存文件内容? 我的Dockerfile如下所示: # Very small Docker image that provides openssl # FROM gliderlabs/alpine:3.3 MAINTAINER Dave Hein <someone@exa

我创建了一个简单的Docker映像,可用于使用openssl创建密钥对。但是当我运行容器时,它会生成一个零长度的密钥文件。然而,以交互方式运行
openssl
命令会生成一个正常大小的密钥文件为什么通过Docker容器运行不会保存文件内容?

我的
Dockerfile
如下所示:

# Very small Docker image that provides openssl
#
FROM gliderlabs/alpine:3.3
MAINTAINER Dave Hein <someone@example.org>

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 run --rm \
  -e KEY_NAME=datihein -e PP_="wat dat?!" \
  -v /var/lib/dockerdata/root/ca:/data/root/ca \
  datihein/ca-cert
运行容器的脚本如下所示:

# Very small Docker image that provides openssl
#
FROM gliderlabs/alpine:3.3
MAINTAINER Dave Hein <someone@example.org>

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 run --rm \
  -e KEY_NAME=datihein -e PP_="wat dat?!" \
  -v /var/lib/dockerdata/root/ca:/data/root/ca \
  datihein/ca-cert
我曾尝试在
echo
之前将
sync
sync-f
添加到CMD,但在主机上的
/var/lib/dockerdata/root/ca/private/datihein.key.pem
中仍然有一个长度为零的文件

我怀疑这个问题与从
expect
内部生成有关,但我不知道如何在容器被拆毁之前强制刷新文件

(重要的是,我的Docker主机系统是在OS X 10.9.5系统的VirtualBox中运行的boot2docker VM。)

更新:解决方案是在完成
expect
命令并销毁容器之前,使用expect命令
wait
等待
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

我找到了解决办法。它确实与
expect
中的
spawn
命令有关

expect
命令
wait
将等待生成的进程完成

我只是用
wait
替换了
interact
命令,它生成了一个正常长度的密钥文件;i、 例如,
openssl
命令在销毁容器之前刷新并关闭输出文件

(费。也许这会帮助其他人。)