将CAT命令unix启动到Dockerfile中

dar*_*men 7 unix cat docker dockerfile

我想启动这个无聊的命令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
Run Code Online (Sandbox Code Playgroud)

但是,当我启动建筑图像泊坞窗时,出现此错误返回:

 ---> 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
Run Code Online (Sandbox Code Playgroud)

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

bha*_*ss1 26

更新 [08/03/2022]:截至dockerfile/dockerfile:1.4.0Here-Document 支持已从labs 通道升级到 stable第2589

您需要通过在环境中设置来使用Docker Buildkit ,将语法解析器指令设置为 use ,并将此处分隔符的位置与 交换。其余的像平常一样使用。DOCKER_BUILDKIT=1dockerfile/dockerfile:1.4.0cat

Dockerfile 示例:

# syntax = docker/dockerfile:1.4.0

...

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
Run Code Online (Sandbox Code Playgroud)

在 之前dockerfile/dockerfile:1.4.0,实验室通道版本支持 Here-Document 语法dockerfile/dockerfile:1.3.0-labs

只需替换syntax上面示例中解析器指令中使用的版本即可。


在 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
Run Code Online (Sandbox Code Playgroud)

...进入这个 Dockerfileecho示例!

RUN echo -e '\
line 1\n\
line 2\n\
line 3\
' > /tmp/example.txt
Run Code Online (Sandbox Code Playgroud)

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

另请注意支持转义换行符 ( )-e的标志。echo\n

注意:不幸的是,-e可能需要也可能不需要该标志,具体取决于echo安装的映像版本。例如,npm:16图像echo不需要并且实际上会与单引号行一起-e打印。-e另一方面,ubuntu:20.04图像echo确实需要-e.

相同的示例可以写在一行上: RUN echo -e 'line 1\nline 2\nline 3' >> /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
Run Code Online (Sandbox Code Playgroud)

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


w11*_*00n 11

根据对Github上发布的问题的评论,此方法有效:

RUN echo 'All of your\n\
multiline that you ever wanted\n\
into a dockerfile\n'\
>> /etc/example.conf
Run Code Online (Sandbox Code Playgroud)

  • echo 命令必须与 -e 选项一起使用以支持换行符“\n”或制表符“\t”。`回声-e` ... (3认同)
  • 如果您的多行以“#”字符开头,则此方法不起作用。在这种情况下,您可以重新排列字符串。例如, `echo '\[NL]#!/bin/bash\n'` 可以重写为 `echo '#\[NL]!/bin/bash\n'`,其中 `[NL]` 代表一个Dockerfile 中的换行符。 (2认同)

use*_*103 5

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

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

此外,更少的线条 = 更少的层数。70步?约兹人。


Man*_*idt 5

你可以这样写:

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
Run Code Online (Sandbox Code Playgroud)