【问题标题】:Why is this Docker CMD producing a zero-length file?为什么这个 Docker CMD 会生成一个长度为零的文件?
【发布时间】:2016-05-18 01:27:07
【问题描述】:

我创建了一个简单的 Docker 映像,可用于使用 openssl 创建密钥对。但是当我docker run 容器时,它会生成一个零长度的密钥文件。然而以交互方式运行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 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 内部生成有关,但我不知道如何在容器被拆除之前强制刷新文件。

(以防万一,我的 Docker 主机系统是在 OS X 10.9.5 系统上的 VirtualBox 中运行的 boot2docker 虚拟机。)

更新:解决方案是使用expect 命令wait 等待openssl 进程终止,然后再完成expect 命令并销毁容器。更新后的 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

【问题讨论】:

    标签: docker containers expect


    【解决方案1】:

    我找到了解决方案。确实和expect里面的spawn命令有关。

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

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

    (嗯。也许这会对其他人有所帮助。)

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 2021-09-30
      • 2021-03-02
      • 1970-01-01
      • 2014-06-14
      • 2020-01-28
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多