如何解决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/
因此,context目录被复制并设置好了。
总结
在本文中,我们学习了“docker build”命令的使用。本章涵盖了在各种情况下实现该命令的所有关键特性。最重要的是,“上下文”设置是初学者社区中众所周知的疑问。