【问题标题】:launch a CAT command unix into Dockerfile在 Dockerfile 中启动 CAT 命令 unix
【发布时间】:2017-03-14 13:05:46
【问题描述】:

我想启动这个 vagrant 命令 cat(完美运行!)以使用 Dockerfile 配置我的容器:

# Configure Virtualenvwrapper.
RUN cat <<EOF >> /home/docker/.bashrc
# Virtualenvwrapper configuration.
export WORKON_HOME=\$HOME/.virtualenvs
export PROJECT_HOME=\$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
EOF

但是当我启动构建映像 docker 时返回此错误:

 ---> 40f9ed8e187d
Removing intermediate container 85f6c8536520
Step 69 : RUN cat <<EOF >> /home/docker/.bashrc
 ---> Running in dcbb3d441f79
 ---> 78acd9c2e5d5
Removing intermediate container dcbb3d441f79
Step 70 : EXPORT
Unknown instruction: EXPORT

使用 Dockerfile 将 cat 命令 unix 运行到映像中的技巧是什么?

【问题讨论】:

    标签: unix docker dockerfile cat


    【解决方案1】:

    更新 [07/29/2021]:截至dockerfile/dockerfile:1.3.0-labsHere-Document syntax is now supported with the Docker BuildKit backend enabled.

    您需要通过在您的环境中设置DOCKER_BUILDKIT=1 来使用Docker Buildkit,将syntax 解析器指令设置为使用dockerfile/dockerfile:1.3.0-labs,并将此处分隔符的位置与cat 交换。其余的照常使用。

    Dockerfile 示例:

    # syntax = docker/dockerfile:1.3-labs
    
    ...
    
    RUN <<EOF cat >> /home/docker/.bashrc
    # Virtualenvwrapper configuration.
    export WORKON_HOME=\$HOME/.virtualenvs
    export PROJECT_HOME=\$HOME/Devel
    source /usr/local/bin/virtualenvwrapper.sh
    EOF
    

    在 Docker BuildKit 实验室频道 dockerfile/dockerfile:1.3.0-labs 发布之前,不要使用 cat,而是尝试使用 echo

    转这个shellcat例子...

    #!/usr/bin/env sh
    cat <<EOF > /tmp/example.txt
    line 1
    line 2
    line 3
    EOF
    

    ...进入这个 Dockerfile echo 示例!

    RUN echo -e '\
    line 1\n\
    line 2\n\
    line 3\
    ' > /tmp/example.txt
    

    注意echo 示例中的一对单引号 (')。

    还要注意 echo-e 标志以支持转义换行符 (\n)。

    注意:很遗憾,-e 标志可能需要也可能不需要,具体取决于您的映像安装的 echo 版本。例如,npm:16 图像的echo 不需要-e,实际上将打印-e 以及单引号行。另一方面,ubuntu:20.04 图像的echo 确实需要-e

    同样的例子可以写成一行: RUN echo -e 'line 1\nline 2\nline 3' &gt;&gt; /tmp/example.txt,但我发现上面的例子更具可读性。

    要回答 OP 的问题,请使用:

    # Configure Virtualenvwrapper.
    RUN echo -e '\
    # Virtualenvwrapper configuration.\n\
    export WORKON_HOME=\$HOME/.virtualenvs\n\
    export PROJECT_HOME=\$HOME/Devel\n\
    source /usr/local/bin/virtualenvwrapper.sh\
    ' >> /home/docker/.bashrc
    

    注意:转义字符可以由escape directive 重新定义。如果您的 Dockerfile 具有不同的转义字符集,则需要相应地修改示例。

    【讨论】:

    • 伟大的更新,构建工具包是要走的路。
    【解决方案2】:

    您也可以使用以下命令代替 Dockerfile 中的文档

    RUN echo $'[kubernetes] \n\
    name=Kubernetes \n\
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 \n\
    enabled=1 \n\
    gpgcheck=1 \n\
    repo_gpgcheck=1 \n\
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg \n '\
    > /etc/yum.repos.d/kubernetes.repo
    

    【讨论】:

      【解决方案3】:

      基于this comment 发布在 Github 上的问题,此方法有效:

      RUN echo 'All of your\n\
      multiline that you ever wanted\n\
      into a dockerfile\n'\
      >> /etc/example.conf
      

      【讨论】:

      • 如果您的多行以 # 字符开头,这将不起作用。在这种情况下,您可以重新排列字符串。例如,echo '\[NL]#!/bin/bash\n' 可以重写为echo '#\[NL]!/bin/bash\n',其中[NL] 表示 Dockerfile 中的换行符。
      • echo 命令必须与 -e 选项一起使用以支持换行符\n 或制表符\t 字符。 echo -e ...
      【解决方案4】:

      你可以这样写:

      RUN echo "# Virtualenvwrapper configuration." >> /home/docker/.bashrc && \
          echo "export WORKON_HOME=\$HOME/.virtualenvs" >> /home/docker/.bashrc && \
          echo "export PROJECT_HOME=\$HOME/Devel" >> /home/docker/.bashrc && \
          echo "source /usr/local/bin/virtualenvwrapper.sh" >> /home/docker/.bashrc
      

      【讨论】:

        【解决方案5】:

        Dockerfiles 不是批处理文件。每一行/命令都是隔离和提交的。

        只需将内容放入文件并添加/复制即可。如果您需要对其进行自定义,请对其进行 SED。或者,如果您真的、真的、真的想将 CAT 放入一个文件中——将它放入一个真正的批处理文件中,然后添加/复制它,然后运行它。

        此外,更少的行 = 更少的层。 70 步?尤泽斯。

        【讨论】:

        • 另外,您必须在运行时打开交互式标志才能获取 .bashrc。制作一些正确的执行脚本以确保 ENV 变量设置正确 -vs- 容器中的 .bashrc “魔法”。
        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 2013-07-27
        • 2014-10-11
        • 2020-07-25
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        相关资源
        最近更新 更多