我想启动这个流浪者命令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运行到映像中的技巧是什么?
6条答案
按热度按时间8ftvxx2r1#
如果您出于某种原因想避免here-document语法,
printf
比echo $'...'
更符合人体工程学,并且可以移植到POSIXsh
。单引号防止变量的shell插值;如果要扩展变量,请使用双引号(不过这样就需要对任何文字美元符号、反斜线或反斜线进行反斜杠转义)。
up9lanfz2#
根据这条对Github上发布的问题的评论,这是可行的:
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
交换。其余的使用方式与正常一样。停靠文件示例:
在
dockerfile/dockerfile:1.4.0
之前,实验室通道dockerfile/dockerfile:1.3.0-labs
版本支持此处文档语法。只需替换上面示例中
syntax
解析器指令中使用的版本。在Docker BuildKit实验室通道
dockerfile/dockerfile:1.3.0-labs
发布之前,请尝试使用echo
,而不要使用cat
!把这个shell
cat
的例子......插入到这个Dockerfile
echo
示例中!请注意
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的问题,请使用以下内容:
**警告:**转义字符可以由
escape
指令重新定义。如果您的Dockerfile有不同的转义字符集,您需要相应地修改示例。xzv2uavs4#
Dockerfiles不是批处理文件。每一行/命令都是独立和提交的。
只需将内容放入一个文件中,然后添加/复制它。如果您需要自定义它,SED它。或者如果您真的,真的,真的想CAT到一个文件中--将它放入一个真正的批处理文件中,然后添加/复制它,然后运行它。
还有,更少的线条=更少的层次。70步?哇。
e4yzc0pl5#
您可以这样写:
hvvq6cgz6#
您也可以使用下面的命令来代替这里的文档**〈〈**在Dockerfile中