将CAT命令unix启动到Dockerfile中

yhived7q  于 2022-11-04  发布在  Unix
关注(0)|答案(6)|浏览(213)

我想启动这个流浪者命令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

但是当我启动我的building image 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运行到映像中的技巧是什么?

8ftvxx2r

8ftvxx2r1#

如果您出于某种原因想避免here-document语法,printfecho $'...'更符合人体工程学,并且可以移植到POSIX sh

RUN printf '%s\n' > /home/docker/.profile \
    '# Virtualenvwrapper configuration.' \
    'export WORKON_HOME=$HOME/.virtualenvs' \
    'export PROJECT_HOME=$HOME/Devel' \
    'source /usr/local/bin/virtualenvwrapper.sh'

单引号防止变量的shell插值;如果要扩展变量,请使用双引号(不过这样就需要对任何文字美元符号、反斜线或反斜线进行反斜杠转义)。

up9lanfz

up9lanfz2#

根据这条对Github上发布的问题的评论,这是可行的:

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

sg24os4d3#

更新日期[2022年3月8日]:自dockerfile/dockerfile:1.4.0起,此处文档支持为promoted from labs channel to stable. #2589

您需要在您的环境中设置DOCKER_BUILDKIT=1来使用Docker Buildkit,设置语法解析器指令以使用dockerfile/dockerfile:1.4.0,并将here分隔符的位置与cat交换。其余的使用方式与正常一样。
停靠文件示例:


# 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

dockerfile/dockerfile:1.4.0之前,实验室通道dockerfile/dockerfile:1.3.0-labs版本支持此处文档语法。
只需替换上面示例中syntax解析器指令中使用的版本。
在Docker BuildKit实验室通道dockerfile/dockerfile:1.3.0-labs发布之前,请尝试使用echo,而不要使用cat
把这个shell cat的例子...


# !/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)。

**警告:**很遗憾,根据您的映像安装的echo版本,可能需要也可能不需要-e标志。例如,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

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

xzv2uavs

xzv2uavs4#

Dockerfiles不是批处理文件。每一行/命令都是独立和提交的。
只需将内容放入一个文件中,然后添加/复制它。如果您需要自定义它,SED它。或者如果您真的,真的,真的想CAT到一个文件中--将它放入一个真正的批处理文件中,然后添加/复制它,然后运行它。
还有,更少的线条=更少的层次。70步?哇。

e4yzc0pl

e4yzc0pl5#

您可以这样写:

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
hvvq6cgz

hvvq6cgz6#

您也可以使用下面的命令来代替这里的文档**〈〈**在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

相关问题