当前位置: 首页 > 知识库问答 >
问题:

执行形式的Docker RUN命令不起作用

丰智
2023-03-14

我正在构建一个基于阿尔卑斯山的docker图像。

FROM alpine

RUN apk update \
    && apk add lighttpd \
    && rm -rf /var/cache/apk/*

ENV COLOR red

COPY ./index.html /var/www/localhost/htdocs

RUN /bin/ash -c 'echo abcd'
#working
RUN /bin/ash -c "echo $COLOR; sed -i -e 's/red/\$COLOR/g' /var/www/localhost/htdocs/index.html; cat /var/www/localhost/htdocs/index.html;"
#not working
# RUN ["sh", "-c", "echo $COLOR; sed -i -e 's/red/\$COLOR/g' /var/www/localhost/htdocs/index.html; cat /var/www/localhost/htdocs/index.html;"]

CMD ["lighttpd","-D","-f","/etc/lighttpd/lighttpd.conf"]

当我以shell形式运行时,它工作正常,但当我以exec形式运行时,它会给出

/箱子/箱:[sh,:未找到

我试着使用bin/sh、sh、bin/ash、ash。所有这些都有相同的错误。

共有2个答案

阮炯
2023-03-14

我使用Docker已经有几年了,我不知道(直到你提出问题)有shell | exec forms用于运行;-)

问题是您的命令包含环境变量($COLOR),并且没有用exec表单替换|评估。

请参阅:

https://docs.docker.com/engine/reference/builder/#run

与shell窗体不同,exec窗体不调用命令shell。这意味着正常的shell处理不会发生

祖翰音
2023-03-14

Shell负责展开变量,但只会展开双引号中的变量。

您的错误来自于之前的错误,事实上,从shell获取值对您没有任何意义,正确的方法是下一步:

RUN ["sh", "-c", "echo $COLOR; sed -i -e \"s/red/$COLOR/g\" /var/www/localhost/htdocs/index.html; cat /var/www/localhost/htdocs/index.html;"]

一个显示效果的最小示例,仅供参考:

Dockerfile:

FROM alpine
ENV COLOR rednew
RUN echo "red" > /tmp/index.html
RUN ["sh", "-c", "sed -i -e \"s/red/$COLOR/g\" /tmp/index.html; cat /tmp/index.html;"]

结果:

$ docker build -t abc:1 . --no-cache                                                                                              
Sending build context to Docker daemon  5.632kB
Step 1/4 : FROM alpine
 ---> 28f6e2705743
Step 2/4 : ENV COLOR rednew
 ---> Running in 05c43146fab0
Removing intermediate container 05c43146fab0
 ---> 28ea1434e626
Step 3/4 : RUN echo "red" > /tmp/index.html
 ---> Running in 2c8fbbc5fd10
Removing intermediate container 2c8fbbc5fd10
 ---> f884892ad8c4
Step 4/4 : RUN ["sh", "-c", "sed -i -e \"s/red/$COLOR/g\" /tmp/index.html; cat /tmp/index.html;"]
 ---> Running in 6930b3d03438
rednew
Removing intermediate container 6930b3d03438
 ---> b770475672cc
Successfully built b770475672cc
Successfully tagged abc:1
 类似资料:
  • 我试图在一个网站上使用gettext,为此我遵循O'Reilly媒体教程。在第一页的末尾,它说我需要使用命令,但是我的命令行返回以下内容:我在XAMPP上运行我的网站,所以我的整个目录是这样的: 我有考试。php在gettext文件夹中,以及消息。采购订单位于文件夹中。即使我尝试使用poedit,它也不起作用。这是我的测验。php代码: 我不确定bindtextdomain函数中的字符串是否正确。

  • 我只是在Windows中安装jdk和jre版本8。环境变量已设置。我尝试在cmd中运行“java-version”,它显示了安装的java版本。但是当我尝试用“javac projectname”编译java项目时,系统说javac不能被识别为内部命令或外部命令。有谁能告诉我怎么修好它吗? 下面是我的环境变量: C:\users\foody>echo%路径%C:\ProgramData\Oracl

  • 命令是否在的命令行中工作? 第一步: C:\Users\Rezaul 步骤2: C:\Users\Rezaul http://localhost:8000

  • 问题内容: 我正在尝试使用Paramiko将SSH SSH到Brocade交换机中并执行远程命令。代码如下所示: 尝试运行代码时,遇到一个奇怪的错误,如下所示。 协议错误,不是以scp开头! 我不知道错误的原因或SSH连接是否成功。你能帮我这个忙吗? 问题答案: 如果不工作时,首先认为测试是尝试(上 一个 行): 它将使用与相同的SSH API(“ exec”通道)。如果您使用的是Windows,

  • 问题内容: 我正在运行Ubuntu 10.10 64位。我安装了ia32-libs以及Android Debug Bridge版本1.0.26。 我的问题: >>> ???????????? 没有权限 >>>> sudo:adb:找不到命令 >>>错误:设备权限不足 我想这些都有关。这是相关信息。 使用运行CM6.1的植根Moto Droid和运行基于CM7的ROM植根的G-Tab,可以得到相同的

  • 我使用以下基本Maven命令生成了一个项目: 该项目是正确创建的,我可以测试自动生成的App类,而没有任何问题的说明: 稍后,我向POM添加了一些依赖项,获得了以下文件: 最后,为了测试起见,我修改了之前由Maven自己生成的App类: 一系列奇怪的事情发生了: > 即使在POM中指定了较新版本的依赖项,但在.m2文件夹中,下载的版本似乎较旧(例如,commons-lang3的版本为2.1和2.5