如何修复 Docker 构建需要恰好一个参数的错误?


简介

Docker build 是一个容器镜像构建命令。该命令可以帮助您创建容器镜像,并提供一些额外的可调整功能。在使用“docker build”命令构建镜像时,初学者会遇到一个非常常见且简单的问题——参数。本文讨论了遇到此错误的各种情况以及如何解决此错误。文章中还提到了执行构建的不同方法。

创建 Dockerfile

首先,我们将创建一个 Dockerfile。此 Dockerfile 将帮助我们创建“apache-web-server”的 Docker 容器镜像。索引页面存储在默认位置/usr/local/apache2/htdocs/

创建一个名为“TUTORIALSPOINT”的目录。

$mkdir TUTORIALSPOINT

进入“TUTORIALSPOINT”目录,创建一个名为“Dockerfile”的文件,并使用任何代码编辑器打开该文件。这里我们使用 Visual Studio Code。

$cd TUTORIALSPOINT $touch Dockerfile $code .

粘贴下面的 Dockerfile 代码。

#use httpd as the base image FROM httpd:latest #set the working directory WORKDIR /usr/local/apache2/htdocs/ #expose the port on the image EXPOSE 80

不同的构建错误

让我们看看在使用 docker build 命令创建容器镜像时可能遇到的不同构建错误。

示例 1

如果在包含 Dockerfile 的“TUTORIALSPOINT”目录内执行命令。

$pwd

输出

/home/hemant/TUTORIALSPOINT

现在查看构建错误。

$docker build

输出

"docker build" requires exactly 1 argument. See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile

示例 2

如果在没有 Dockerfile 的“TUTORIALSPOINT”目录外部执行命令。

$pwd

输出

/home/hemant

现在查看错误。

$docker build

输出

"docker build" requires exactly 1 argument. See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile

示例 3

如果在没有 Dockerfile 的“TUTORIALSPOINT”目录外部执行命令。

$pwd

输出

/home/hemant

现在查看错误。

$docker build .

输出

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/hemant/Dockerfile: no such file or directory

示例 4

如果在“TUTORIALSPOINT”目录内执行命令,但“Dockerfile”被重命名为其他文件,例如“Dockerfile_2”。

$pwd

输出

/home/hemant/TUTORIALSPOINT

现在查看错误。

$docker build .

输出

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/hemant/Dockerfile: no such file or directory

理解构建命令

到目前为止,我们已经看到了不同的构建错误。现在,理解“docker build”命令将是最好的。下面我们对命令的所有部分进行了分解。

命令的通用语法为:

$docker build [options] [local path or url]

重要的选项如下所示

文件

Dockerfile 的默认文件名是“Dockerfile”,但要更改它,您可以使用“-f”标志。此标志需要 Dockerfile 的相对路径以及您保存它的名称。

标签

当我们想要重命名使用 docker build 创建的镜像时,使用“-t”标志。这也可以写成“--tag”。

分配标签的通用语法:名称-版本 如果您没有定义镜像的版本,则 Docker 本身会提供“latest”版本。

路径或上下文目录

此路径是本地相对路径,在执行 COPY 和 ADD 等命令时,Dockerfile 将将其用作参考。此路径也称为“上下文目录”。Docker 守护程序首先获取上下文目录,然后在构建过程中查找需要复制到镜像中的文件。

URL

如果您要复制的文件不在您的本地系统上,则只需提及远程目录的“URL”,而不是本地路径。例如,您可以使用 GitHub 存储库 URL。

实现案例

构建 Docker 镜像时存在各种情况。下面列出了一些情况。

案例 1:“docker build”的最简单实现

步骤 1 - 创建一个名为“TUTORIALSPOINT”的目录

$mkdir TUTORIALSPOINT

步骤 2 - 创建一个名为“Dockerfile”的 Dockerfile

$cd TUTORIALSPOINT
$touch Dockerfile

将以下代码保存到其中。

#use httpd as the base image FROM httpd:latest #set the working directory WORKDIR /usr/local/apache2/htdocs/ #expose the port on the image EXPOSE 80

打开此文件并将以下代码保存到其中。

步骤 3 - 构建 Docker 镜像

最简单的实现

$docker build .

输出

Sending build context to Docker daemon 3.072kB Step 1/3 : FROM httpd:latest ---> fe8735c23ec5 Step 2/3 : WORKDIR /usr/local/apache2/htdocs/ ---> Using cache ---> 933e884d81bc Step 3/3 : EXPOSE 80 ---> Using cache ---> a127ab71efab Successfully built a127ab71efab

镜像名称将为 none,并且会获得一个 ID。要命名镜像,请使用以下命令。

$docker build –t image1:version1 .

输出

Sending build context to Docker daemon 3.072kB Step 1/3 : FROM httpd:latest ---> fe8735c23ec5 Step 2/3 : WORKDIR /usr/local/apache2/htdocs/ ---> Using cache ---> 933e884d81bc Step 3/3 : EXPOSE 80 ---> Using cache ---> a127ab71efab Successfully built a127ab71efab Successfully tagged image1:version1

检查创建的镜像。

$docker images

输出

REPOSITORY TAG IMAGE ID CREATED SIZE image1 version1 a127ab71efab 2 days ago 145MB

案例 2:更改 Dockerfile 的名称

请按照以下步骤使用 dockerfile 而不是“Dockerfile”。

步骤 1:使用与上述相同的 Dockerfile 代码创建一个名为“tutorialfile”的文件。

$touch tutorialfile

步骤 2:现在使用此 Dockerfile 构建镜像

通用语法:docker build –f dockerfile完整路径 –t 名称:版本 .

$docker build -f /home/hemant/TUTORIALSPOINT/tutorialfile -t test2:v1 .

输出

Sending build context to Docker daemon 3.584kB Step 1/3 : FROM httpd:latest ---> fe8735c23ec5 Step 2/3 : WORKDIR /usr/local/apache2/htdocs/ ---> Using cache ---> 933e884d81bc Step 3/3 : EXPOSE 80 ---> Using cache ---> a127ab71efab Successfully built a127ab71efab Successfully tagged test2:v1

这将从“tutorialfile”创建 Docker 镜像。检查创建的镜像。

$docker images

输出

REPOSITORY TAG IMAGE ID CREATED SIZE test2 v1 a127ab71efab 2 days ago 145MB

案例 3:更改上下文目录

在以上示例中,我们通过使用“点”将上下文目录用作“当前工作目录”。

步骤 1:创建一个名为“newdockerfile”的新 Dockerfile

$touch newdockerfile

将以下代码添加到 Dockerfile 中。

#use httpd as the base image FROM httpd:latest #set the working directory WORKDIR /usr/local/apache2/htdocs/ RUN rm index.html #copy all the files in TUTORIALSPOINT to the container image. COPY . . #expose the port on the image EXPOSE 80

步骤 2:退出 TUTORIALSPOINT 目录。

首先复制当前工作目录的路径。

$pwd

退出目录。

$cd ..

步骤 3:现在执行 docker build 命令。

$docker build \
   -f /home/hemant/TUTORIALSPOINT/tutorialfile \
   -t test3:v1 \
/home/hemant/TUTORIALSPOINT

输出

Sending build context to Docker daemon 2.56kB Step 1/5 : FROM httpd:latest ---> fe8735c23ec5 Step 2/5 : WORKDIR /usr/local/apache2/htdocs/ ---> Using cache ---> 933e884d81bc Step 3/5 : RUN rm index.html ---> Using cache ---> 0775ee5efabc Step 4/5 : COPY . . ---> ae8dd9f280da Step 5/5 : EXPOSE 80 ---> Running in bccffebf7db2 Removing intermediate container bccffebf7db2 ---> 6261cc2ca031 Successfully built 6261cc2ca031 Successfully tagged test3:v1

步骤 4:现在运行容器并检查上下文目录是否设置为“home/hemant/TUTORIALSPOINT”

$docker run -itd --name cont -p 8080:80 test3:v1

步骤 5:检查上下文目录是否已复制到 apache 服务器上。访问 https://127.0.0.1:8080/

因此,上下文目录已正确复制和设置。

结论

本文介绍了“docker build”命令的使用。涵盖了在各种情况下实现该命令的所有关键功能。最重要的是,“上下文”设置是初学者社区中一个众所周知的疑问。

更新于: 2023年1月11日

5K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告