如何解决Docker构建时正好需要一个参数的问题

如何解决Docker构建时正好需要一个参数的问题

简介

Docker build是一个容器镜像生成器命令。该命令帮助你创建具有一些额外可调整功能的容器镜像。在使用 “docker build “命令构建镜像时,初学者会面临一个非常常见和简单的争论问题。在这篇文章中,我们讨论了遇到该错误的各种方式以及如何解决该错误。文章中还提到了执行构建的不同方法。

创建Docker文件

首先,我们将创建一个dockerfile。这个dockerfile将帮助我们创建一个 “apache-web-server “的docker容器镜像。索引页被存储为默认位置/usr/local/apache2/htdocs/。

制作一个目录 “TUTORIALSPOINT”。

$mkdir TUTORIALSPOINT

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

$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

如果命令在 “TUTORIALSPOINT “目录外执行,其中没有Docker文件。

$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

如果命令在 “TUTORIALSPOINT “目录外执行,其中没有Docker文件。

$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

理解Build命令

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

该命令的通用语法为 −

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

下面列出了一些重要的选项

File

dockerfile的默认文件名是” dockerfile “,但你可以使用” -f “参数来更改它。这个标志需要dockerfile文件的相对路径和你保存它的文件名。

Tag

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

如果你没有定义镜像的版本号,那么docker本身会提供一个“最新”版本。

路径或上下文目录

这个路径是一个本地相对路径,dockerfile在执行COPY和ADD等命令时将使用它作为参考。这个路径也被称为“上下文目录”。Docker daemon首先获取上下文目录,然后在构建时找到需要在映像中复制的文件。

URL

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

实现案例

构建docker镜像有多种情况。下面将提到一些情况。

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

第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:创建一个名为“tutorialfile”的文件,并使用与上面相同的dockerfile代码

$touch tutorialfile

第2步:现在使用这个dockerfile构建镜像

通用语法:docker build -f complete_path_of_dockerfile -t name:版本号。

$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 /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服务器上的Context目录是否已拷贝。访问http://localhost:8080/

如何解决Docker构建时正好需要一个参数的问题

因此,context目录被复制并设置好了。

总结

在本文中,我们学习了“docker build”命令的使用。本章涵盖了在各种情况下实现该命令的所有关键特性。最重要的是,“上下文”设置是初学者社区中众所周知的疑问。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程