如何修復 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://:8080/
因此,上下文目錄已正確複製和設定。
結論
本文介紹了“docker build”命令的使用。涵蓋了在各種情況下實現該命令的所有關鍵功能。最重要的是,“上下文”設定是初學者社群中一個眾所周知的疑問。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP