概述

Docker 是一个开源容器平台,它允许我们将应用程序打包到容器中,并标准化组合应用源代码与操作系统的可执行组件。它是一种用于构建、共享和运行单独容器的软件开发工具包。

Dockerfile 是一个包含用于构建镜像的一系列命令的文本文件。它是自动化镜像创建的最简单方法。

Dockerfile 的一个好处是,我们只需要编写等同于 Linux 命令行命令的命令,因此不需要学习任何新的语法。

在使用 Dockerfile 构建镜像时,我们可能会遇到不同的问题。在这篇教程中,我们将学习解决一个非常常见的 Docker 构建问题。

首先,让我们理解错误“Docker 构建需要 1 个参数”。

了解问题

在本节中,首先,我们将创建一个示例 Dockerfile 来重现错误,然后使用不同的方法解决它。让我们创建一个名为“Dockerfile”的新 Dockerfile,其中包含以下内容:

FROM        centos:7
RUN         yum -y install wget \
            && yum -y install unzip \
            && yum install -y nc \
            && yum -y install httpd && \
            && yum clean all
EXPOSE      6379
ENTRYPOINT  ["ping"]
CMD  ["google.com"]

在这里,我们编写了一个使用“centos:7*”作为基础镜像的示例 Dockerfile。因此,它支持 CentOS 的所有命令。

我们还安装了 Docker 的其他实用命令。

重现此错误的命令“Docker 构建需要 1 个参数”是:

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

如果使用不同的选项使用 Docker 构建命令,也会出现此问题。

让我们探索其中一个选项:

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

在两种情况下,我们都遇到了“Docker 构建需要 1 个参数”的问题。

不同方式构建 Docker 镜像

在解决错误“Docker 构建需要 1 参数”之前,让我们先通过使用不同选项来理解 Docker 构建命令。

Docker 构建由 Docker 服务端运行。首先,Docker 构建将整个上下文发送给服务端。理想的情况是从空目录开始,并仅添加构建 Docker 镜像所需的 Dockerfile 文件:

$ docker build .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM        centos:7
14.04: Pulling from library/centos
2e6e20c8e2e6: Extracting [============>                                      ]  17.83MB/70.69MB
0551a797c01d: Download complete 
512123a864da: Download complete 

我们也可以使用 -f 标志从特定位置构建镜像的 Dockerfile:

$ docker build -f /root/dockerImage/Dockerfile .

为了标记镜像,我们可以使用 Docker 构建命令的 -t 选项:

$ docker build -t test_image/centos .

我们还可以传递构建参数与 Docker 构建命令:

$ docker build -t test_image/centos --build-arg JAVA_ENV=1.8  .

为了清理镜像的构建,我们可以使用 --no-cache 选项命令:

$ docker build -t test_image/centos --build-arg JAVA_ENV=1.8  --no-cache .

在较旧版本的 Docker 中,我们需要传递 --no-cache=true,但在新版本中情况并非如此。我们也可以创建一个不以文件名 Dockerfile 作为文件名的 Dockerfile:

$ docker build -f /root/dockerImage/DockerFile_JAVA .

这里我们使用 DockerFile_JAVA 文件名构建了一个 Docker 镜像。

由于参数不足

“Docker 构建需要 1 个参数”错误最常见的原因是尝试构建镜像而不提供足够的参数。在这里,在参数中,我们需要提供指向命令的目录。

默认情况下,我们提供了点(.),这告诉 Docker 使用 shell 的当前工作目录作为构建上下文:

$ docker build .

点(.)基本上告诉 Docker Dockerfile 必须从当前目录使用。我们也可以使用以下命令更改 Docker 构建上下文:

$ docker build /root/test

与 Docker 构建命令相关的一个可能遇到的问题:

$ docker build -f /root/test/Dockerfile2 .
unable to prepare context: unable to evaluate symlinks in Dockerfile path:
  lstat /root/test/Dockerfile2: no such file or directory

在这里,我们在命令中尝试使用文件名“Dockerfile2”构建 Docker 镜像,如果此文件不在当前目录中,我们将获得以下错误:

unable to prepare context: unable to evaluate symlinks in Dockerfile path:
  lstat /root/test/Dockerfile2: no such file or directory

为了解决此问题,我们需要使用 -f 选项提供正确的文件名。

总结

在本教程中,我们学习了与 Docker 构建命令相关的几个问题。

最初,我们探索了构建 Docker 镜像的不同方式,然后解决了与 Docker 构建参数有关的问题,最后学习了与 Docker 构建命令相关的几个更多问题。