Docker 精通之 Dockerfile

Docker 精通系列

  • Docker 精通之入門
  • Docker 精通之微服務
  • Docker 精通之常用命令
  • Docker 精通之 Dockerfile

1.基本說明

  Dockfile 是一個用于編寫 docker 鏡像生成過程的文件,其有特定的語法。在一個文件夾中,如果有一個名字為 Dockfile 的文件,其內容滿足語法要求,在這個文件夾路徑下執行命令,就可以按照描述構建一個鏡像了。

docker build --tag name:tag .
# name是鏡像的名稱,tag是鏡像的版本或者是標簽號,不寫就是lastest。注意后面有一個空格和點。

dockerfile 簡單文件實例

FROM node:8.4COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js
  • FROM node:8.4:該 image 文件繼承官方的 node image,冒號表示標簽,這里標簽是8.4,即8.4版本的 node。
  • COPY . /app:將當前目錄下的所有文件(除了.dockerignore排除的路徑),都拷貝進入 image 文件的/app目錄。
  • WORKDIR /app:指定接下來的工作路徑為/app。
  • RUN npm install:在/app目錄下,運行npm install命令安裝依賴。注意,安裝后所有的依賴,都將打包進入 image 文件。
  • EXPOSE 3000:將容器 3000 端口暴露出來, 允許外部連接這個端口。
  • CMD node demos/01.js:它表示容器啟動后自動執行node demos/01.js

RUN命令在 image 文件的構建階段執行,執行結果都會打包進入 image 文件;CMD命令則是在容器啟動后執行。另外,一個 Dockerfile 可以包含多個RUN命令,但是只能有一個CMD命令。

注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會覆蓋CMD命令。下面詳細介紹。

2.Dockfile 語法

  Dockerfile的基本指令有十三個,分別是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD。下面對這些指令的用法一一說明。

2.1 FROM

  用法:FROM <image>

  說明:第一個指令必須是FROM了,其指定一個構建鏡像的基礎源鏡像,如果本地沒有就會從公共庫中拉取,沒有指定鏡像的標簽會使用默認的latest標簽,可以出現多次,如果需要在一個 Dockerfile 中構建多個鏡像。

2.2?MAINTAINER

  用法:MAINTAINER <name> <email>

  說明:描述鏡像的創建者,名稱和郵箱

2.3 RUN

  用法:RUN "command" "param1" "param2"

  說明:RUN 命令是一個常用的命令,執行完成之后會成為一個新的鏡像,這里也是指鏡像的分層構建。一句RUN就是一層,也相當于一個版本。這就是之前說的緩存的原理。我們知道docker是鏡像層是只讀的,所以你如果第一句安裝了軟件,用完在后面一句刪除是不可能的。所以這種情況要在一句RUN命令中完成,可以通過&符號連接多個RUN語句。RUN后面的必須是雙引號不能是單引號(沒引號貌似也不要緊),command是不會調用shell的,所以也不會繼承相應變量,要查看輸入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。

2.4 CMD

  用法:CMD command param1 param2

  說明:CMD 在 Dockerfile 中只能出現一次,有多個,只有最后一個會有效。其作用是在啟動容器的時候提供一個默認的命令項。如果用戶執行docker run的時候提供了命令項,就會覆蓋掉這個命令。沒提供就會使用構建時的命令。

2.5 EXPOSE

  用法:EXPOSE <port> [<port>...]

  說明:告訴Docker服務器容器對外映射的容器端口號,在 docker run -p 的時候生效。

2.6 ENV

  用法:EVN <key> <value> 只能設置一個

     ? EVN <key>=<value>允許一次設置多個

  說明:設置容器的環境變量,可以讓其后面的RUN命令使用,容器運行的時候這個變量也會保留。

定義環境變量的同時,可以引用已經定義的環境變量。在ENV指令中,可以直接引用如下環境變量:

  1. HOME,用戶主目錄
  2. HOSTNAME,默認容器的主機名
  3. PATH,
  4. TERM,默認xterm
ENV PATH /usr/local/bin:$PATH
ENV LANG C.UTF-8
ENV TERM xterm
ENV PYTHON_VERSION 3.5.3
ENV name1=ping name2=on_ip

2.7 ADD

  用法:ADD <src> ? <dest>

  說明:復制本機文件或目錄或遠程文件,添加到指定的容器目錄,支持GO的正則模糊匹配。路徑是絕對路徑,不存在會自動創建。如果源是一個目錄,只會復制目錄下的內容,目錄本身不會復制。ADD命令會將復制的壓縮文件夾自動解壓,這也是與COPY命令最大的不同。

2.8 COPY

  用法:COPY <src> <dest>

  說明:COPY除了不能自動解壓,也不能復制網絡文件。其它功能和ADD相同。

2.9 ENTRYPOINT

  用法:ENTRYPOINT "command" "param1" "param2"

  說明:這個命令和CMD命令一樣,唯一的區別是不能被docker run命令的執行命令覆蓋,如果要覆蓋需要帶上選項--entrypoint,如果有多個選項,只有最后一個會生效。

2.10 VOLUME

  用法:VOLUME ["path"]

  說明:在主機上創建一個掛載,掛載到容器的指定路徑。docker run -v命令也能完成這個操作,而且更強大。這個命令不能指定主機的需要掛載到容器的文件夾路徑。但docker run -v可以,而且其還可以掛載數據容器。

2.11 USER

  用法:USER daemon

  說明:指定運行容器時的用戶名或UID,后續的RUN、CMD、ENTRYPOINT也會使用指定的用戶運行命令。

2.12 WORKDIR

  用法:WORKDIR path

  說明:為RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,后續參數如果是相對路徑,則會基于之前的命令指定的路徑。如:WORKDIR ?/home  WORKDIR test 。最終的路徑就是/home/test。path路徑也可以是環境變量,比如有環境變量HOME=/home,WORKDIR $HOME/test也就是/home/test。

2.13 ONBUILD

  用法:ONBUILD [INSTRUCTION]

  說明:配置當前所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。意思就是,這個鏡像創建后,如果其它鏡像以這個鏡像為基礎,會先執行這個鏡像的ONBUILD命令。

3.Dockerfile例子

  一個使用安裝包安裝的tomcat例子:

FROM centosMAINTAINER nobody?"xx@qq.com"
RUN mkdir -p /opt/jdk/
RUN mkdir -p /opt/tomcat/
ADD jdk1.7.0_79 /opt/jdk/
ADD tomcat? /opt/tomcat/
ENV CATALINA_HOME /opt/tomcat
ENV JAVA_HOME /opt/jdk
EXPOSE?8080
ENV PATH $PATH:$JAVA_HOME/bin
CMD ["/opt/tomcat/bin/catalina.sh","run"]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言中int的取值范圍_c語言入門(1)

c語言入門C語言一經出現就以其功能豐富、表達能力強、靈活方便、應用面廣等特點迅速在全世界普及和推廣。C語言不但執行效率高而且可移植性好&#xff0c;可以用來開發應用軟件、驅動、操作系統等。C語言也是其它眾多高級語言的鼻祖語言&#xff0c;所以說學習C語言是進入編程世…

vue : 無法將“vue”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確, 然后再試一次。

vue : 無法將“vue”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正確&#xff0c; 然后再試一次。 報錯原因&#xff1a; 沒有安裝腳手架vue-cli 解決方法&#xff1a;安裝腳手架vue-cli npm inst…

session的生命周期

session的生命周期分為創建、活動、銷毀三個階段 創建一個新的會話不代表舊的會話就銷毀了 session.invalidate()方法可以銷毀當前會話 在page1中寫上這個方法再打開網頁 說明該會話被銷毀了出現了錯誤 我們把這個方法寫在所有代碼段的下面 再打開這個網頁 刷新網頁 這個sessio…

虛擬化與網絡

本文轉自Grodd51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog.51cto.com/juispan/1959791&#xff0c;如需轉載請自行聯系原作者

算法基礎之搜索和經典排序

目錄 簡介 搜索算法 二分法查找 排序算法 冒泡排序&#xff08;Bubble Sort&#xff09; 選擇排序&#xff08;Selection Sort&#xff09; 插入排序&#xff08;Insert Sort&#xff09; 快速排序&#xff08;Quick Sort&#xff09; 歸并排序&#xff08;Merge Sort…

IT人不要一直做技術

發表于&#xff1a;2009-03-04 09:51:44 樓主IT人不要一直做技術 【引子】感覺這篇文章很有深意&#xff0c;正是我所想說的話。希望大家有借鑒。 【原文】 我現在是自己做&#xff0c;但我此前有多年在從事軟件開發工作&#xff0c;當回過頭來想一想自己&#xff0c;覺得特別…

背景寬高隨文本變化_中科大提出ContourNet:更準確的任意形狀場景文本檢測新方法...

點擊上方“CVer”&#xff0c;選擇加"星標"置頂重磅干貨&#xff0c;第一時間送達本文轉載自&#xff1a;CSIG文檔圖像分析與識別專委會本文簡要介紹2020年被CVPR錄用的論文“ContourNet: Taking a Further Step toward Accurate Arbitrary-shaped Scene Text Detect…

python 類、模塊、包的區別

學習python的時候&#xff0c;碰到了import 和 from xx import xx的問題&#xff0c; 為了弄清楚什么是 module 和package &#xff0c;這篇文章講解的不錯&#xff01;&#xff01; 原文&#xff1a; http://www.cnblogs.com/kex1n/p/5977051.html --------------------------…

Hadoop MapReduce概念學習系列之MPI和MapReduce(十三)

在當前最流行的高性能并行體系結構中比較常用的并行編程環境分為兩類:消息傳遞和共享存儲。MPI是基于消息傳遞的經典代表&#xff0c;是消息傳遞井行程序設計的標準&#xff0c;用于構建高可靠的、可伸縮的、靈活的分布式應用程消息傳遞井行處理開銷比較大&#xff0c;適合于大…

算法面試題匯總(更新中)

1、根據數字返回相應位置數字 def get_digit(num, i):# i0 個位 1 十位 2 百位...return num // (10 ** i) % 10# print(get_digit(12345, 6)) 2、列表反轉&#xff0c;不用內置函數 def reverse_list(li):n len(li)for i in range(n // 2):li[i], li[n-i-1] li[n-i-1], …

在python中os_在Python中使用os.execvp

我有一個關于在 Python中使用os.execvp的問題.我有以下用于創建參數列表的代碼&#xff1a; args [ "java" , classpath , "-Djava.library.path" lib_path() , ea , "-Xmx1000m" , "-server" , "code_swarm" , params ] …

WEBGL學習【四】模型視圖矩陣

<html lang"zh-CN"><!--服務器運行地址&#xff1a;http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWebGL4.html--> <head><title>NeHes WebGL</title><meta charset"UTF-8"/><!--引入需要的庫文件--><scr…

使用Jmeter對mysql進行性能測試入門

使用Jmeter對mysql進行性能測試入門 第一步&#xff1a;測試環境準備&#xff1a; 1&#xff09;、mysql> select version(); ----------- | version() | ----------- | 5.5.13 | ----------- ms數據庫數據&#xff1a; mysql> select count(*) from account; ----------…

算法基礎之數據結構

whats the 數據結構 數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。 簡單來說&#xff0c;數據結構就是設計數據以何種方式組織并存儲在計算機中。 比如&#xff1a;列表、集合與字典等都是一種數據結構。 通常情況下&#xff…

soap接口怎么不返回tuple python_Python 中的接口

Python 是動態類型語言, 只在運行時做 Duck Typing 檢查.利: 靈活, 方便弊: 代碼混亂, 缺少規范標準自帶兩類接口支持: abc 和 typing.Protocol, 有他們協助給天馬行空的程序員套上枷鎖, Python 的大工程才可以"上道"abcabc 就是 Abstract Base Class, 虛基類. 跟 Ja…

java 第11次作業:你能看懂就說明你理解了——this關鍵字

this 代表當前對象 轉載于:https://www.cnblogs.com/qingyundian/p/7736699.html

c#多線程操作界面控件的簡單實現

一個小功能&#xff0c;早有人實現了。自己在一個項目中用到&#xff0c;覺得有必要記錄一下&#xff0c;寫下來。代碼 從上面你可能已經看出如何多線程操作同一個控件的&#xff0c;就是通過一個委托&#xff0c;然后定義委托方法&#xff0c;判斷控件的InvokeRequired屬性&am…

ssh 免密_Linux下配置SSH免密通信 “sshkeygen”的基本用法

利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統上的一個程序&#xff0c;后來又迅速擴展到其他操作平臺。1 什么是SSH引用百度百科的說明:SSH 為 Secure Shell的縮寫&#xff0c;由 IETF 的網絡小組(Network Working Group)所制定&#xff1b;它是…

Python 第三方模塊之 NumPy - 科學計算

NumPy 簡介 NumPy 發展歷史 1995年 Jim HugUNin開發了Numeric。隨后&#xff0c;Numarray包誕生。Travis Oliphants整合Numeric和Numarray&#xff0c;開發Numpy&#xff0c;于2006年發布第一個版本。Numpy&#xff08;Numeric Python&#xff09;提供了許多高級的數值編程工…

keepalived與lvs結合使用配置實例

keepalived可以實現兩大功能是&#xff1a;健康檢測和故障轉移 keepalived.conf的配置 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950global_defs {notification_email { acassenfirewall.loc failoverfirewall.loc sysadminf…