概述
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 构建命令相关的几个更多问题。