为什么Dockerfile运行打印回声选项



在最新的macOS上使用最新的docker。

我有一个dockerfile:

FROM debian:8
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -y -q 
    && apt-get install -y -q apt-utils 
    && apt-get upgrade -y -q 
    && apt-get install -y -q ssh build-essential libssl-dev libffi-dev python-dev python-pip python-six openjdk-7-jdk 
    && mkdir -p /etc/ansible 
    && echo -e "[ssh_connection]nssh_args = -o ControlMaster=no -o ControlPersist=60sn" > /etc/ansible/ansible.cfg

问题是回声命令。该命令产生的文件的内容是:

-e [ssh_connection]
ssh_args = -o ControlMaster=no -o ControlPersist=60s

也打印了-e选项!ECHO的选项甚至更疯狂,这是新lines被解析的。实际上,如果我附加到容器上并再次运行相同的命令,则会获得正确的文件内容。我认为这可能是docker build在运行中引用每个参数的问题,但是即使我运行echo "-e" "XnY"命令打印:

X
Y

有人知道为什么会发生这种情况吗?

尝试运行:

RUN bash -c 'echo -e ...'

仔细阅读https://github.com/docker/docker/sissues/8949,我知道怪异行为的原因取决于解释壳。

在我的情况下,运行Ubuntu映像,足以删除 -E 以正确格式化行:

RUN echo "# User rules for foobarn
            foobar ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/nopasswd

的结果是:

# User rules for foobar
            foobar ALL=(ALL) NOPASSWD:ALL

最好不要在 RUN中使用双引号。始终使用单个报价或使用ENV变量来设置环境变量。

ex:

echo '******* Installing PPA pack ********'
ENV JAVA_HOME /usr/bin/java

最新更新