问题描述
在使用Dockerfile构建镜像时,遇到了以下错误:Dockerfile解析错误行 5: 未知指令: -ESSENTIAL。用户想知道自己做错了什么,是否有类似于-essential的替代指令。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据用户提供的Dockerfile,问题出在第5行的指令-essential
上。这是一个拼写错误,正确的包名应该是build-essential
。此外,如果你想将一个RUN语句拆分成多行,你需要使用反斜杠进行行继续。
以下是修正后的Dockerfile示例:
FROM ubuntu:16.04
MAINTAINER James Turnbull "james@example.com"
ENV REFRESHED_AT 2016-06-01
RUN apt-get update -yqq && apt-get -yqq install ruby ruby-dev \
build-essential redis-tools
RUN gem install --no-rdoc --no-ri sinatra json redis
RUN mkdir -p /opt/webapp
EXPOSE 4567
CMD [ "/opt/webapp/bin/webapp" ]
在上面的示例中,我们将第5行的指令-essential
更正为build-essential
。此外,我们还使用反斜杠将RUN语句拆分成多行,以提高可读性。
作为个人建议,当你有多个命令需要运行时,通常最好使用&&
连接它们,而不是使用分号;
,因为你希望如果任何一个命令失败,构建过程也会失败。
修正后的Dockerfile将确保你的镜像能够成功构建。
方案2
如果你不想修改Dockerfile,你可以尝试使用Docker的多阶段构建功能。这将允许你在一个阶段中安装构建工具,然后在另一个阶段中使用这些工具构建你的应用程序。
以下是一个示例Dockerfile,演示了如何使用多阶段构建来解决这个问题:
# 第一个阶段:安装构建工具
FROM ubuntu:16.04 AS builder
RUN apt-get update -yqq && apt-get -yqq install build-essential
# 第二个阶段:构建应用程序
FROM builder AS app_builder
RUN apt-get update -yqq && apt-get -yqq install ruby ruby-dev redis-tools
RUN gem install --no-rdoc --no-ri sinatra json redis
RUN mkdir -p /opt/webapp
COPY . /opt/webapp
WORKDIR /opt/webapp
EXPOSE 4567
CMD [ "/opt/webapp/bin/webapp" ]
在上面的示例中,我们使用了两个阶段。第一个阶段使用build-essential
安装了构建工具。第二个阶段使用了第一个阶段构建的工具来构建应用程序。这样,你就可以在不修改原始Dockerfile的情况下解决问题。
请注意,多阶段构建功能需要Docker 17.05或更高版本才能使用。
以上是解决Dockerfile解析错误的两种方案,你可以根据自己的需求选择其中之一来解决问题。