Dockerfile中的Shell脚本出现错误:意外的文件结尾(期望“do”)。

4

我不想再创建一个带有脚本的.sh文件,而是希望直接在Dockerfile中添加Shell脚本代码。但是,在构建镜像时,我收到了以下错误信息:

/bin/sh: 语法错误:意外的文件结尾(期望“do”)

这是Dockerfile中包含脚本的部分:

RUN cat .env | while [ read LINE ] \
do \
    envName=$(echo "$LINE" | grep -o "^[^\=]*") \
    echo "PassEnv $envName" >> httpd.conf \
done

有什么想法是错的吗?
3个回答

4

我在将创建于Windows的文件复制到Linux容器时,忘记确保文件中的行尾符是 LF(而不是 CRLF ),导致出现了这个问题。将文件转换为使用 LF 行尾符解决了该问题。


如果您能包含“如何”转换的说明,那将更加有帮助! - mukesh.kumar
感谢您的反馈。大多数文本编辑器和许多独立工具都可以完成此操作。具体说明将根据您使用的工具而异。我碰巧使用sublime text进行转换,但任何进一步的细节最好保留在单独的问题中,特别是如何做到这一点。 - mo.

4

删除方括号[],在每行末尾使用;,因为当docker看到你的\时,会将行连接起来,导致命令融合在一起。

以下是适用于我的代码:

RUN cat .env | while read LINE ;\
    do \
      envName=$(echo "$LINE" | grep -o "^[^\=]*"); \
      echo "PassEnv $envName" >> httpd.conf ;\
    done

1
< p > < code > while 构造需要在单独的一行上输入 < code > do (或在分号后输入)。因此,您可能想要:

RUN cat .env | while [ read LINE ]; \
do \
    envName=$(echo "$LINE" | grep -o "^[^\=]*") \
    echo "PassEnv $envName" >> httpd.conf \
done

注意第一行的分号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接