導航:首頁 > 程序命令 > dockerfile命令為兩類

dockerfile命令為兩類

發布時間:2022-06-14 18:36:09

㈠ 如何用Dockerfile創建鏡像

Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為注釋,每一行只支持一條指令,每條指令可以攜帶多個參數。
Dockerfile的指令根據作用可以分為兩種,構建指令和設置指令。構建指令用於構建image,其指定的操作不會在運行image的容器上執行;設置指令用於設置image的屬性,其指定的操作將在運行image的容器中執行。

(1)FROM(指定基礎image)
構建指令,必須指定且需要在Dockerfile其他指令的前面。後續的指令都依賴於該指令指定的image。FROM指令指定的基礎image可以是官方遠程倉庫中的,也可以位於本地倉庫。
該指令有兩種格式:

[plain] view plain
FROM <image>
指定基礎image為該image的最後修改的版本。或者:

[plain] view plain
FROM <image>:<tag>
指定基礎image為該image的一個tag版本。

(2)MAINTAINER(用來指定鏡像創建者信息)
構建指令,用於將image的製作者相關的信息寫入到image中。當我們對該image執行docker inspect命令時,輸出中有相應的欄位記錄該信息。
格式:

[plain] view plain
MAINTAINER <name>

(3)RUN(安裝軟體用)
構建指令,RUN可以運行任何被基礎image支持的命令。如基礎image選擇了ubuntu,那麼軟體管理部分只能使用ubuntu的命令。
該指令有兩種格式:

[plain] view plain
RUN <command> (the command is run in a shell - `/bin/sh -c`)
RUN ["executable", "param1", "param2" ... ] (exec form)

(4)CMD(設置container啟動時執行的操作)
設置指令,用於container啟動時指定的操作。該操作可以是執行自定義腳本,也可以是執行系統命令。該指令只能在文件中存在一次,如果有多個,則只執行最後一條。
該指令有三種格式:

[plain] view plain
CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
CMD command param1 param2 (as a shell)
當Dockerfile指定了ENTRYPOINT,那麼使用下面的格式:

[plain] view plain
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
ENTRYPOINT指定的是一個可執行的腳本或者程序的路徑,該指定的腳本或者程序將會以param1和param2作為參數執行。所以如果CMD指令使用上面的形式,那麼Dockerfile中必須要有配套的ENTRYPOINT。

(5)ENTRYPOINT(設置container啟動時執行的操作)
設置指令,指定容器啟動時執行的命令,可以多次設置,但是只有最後一個有效。
兩種格式:

[plain] view plain
ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
ENTRYPOINT command param1 param2 (as a shell)
該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。
當獨自使用時,如果你還使用了CMD命令且CMD是一個完整的可執行的命令,那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效。

[plain] view plain
# CMD指令將不會被執行,只有ENTRYPOINT指令被執行
CMD echo 「Hello, World!」
ENTRYPOINT ls -l
另一種用法和CMD指令配合使用來指定ENTRYPOINT的默認參數,這時CMD指令不是一個完整的可執行命令,僅僅是參數部分;ENTRYPOINT指令只能使用JSON方式指定執行命令,而不能指定參數。

㈡ docker commit和docker file的區別

製作鏡像的方式主要有兩種:
通過docker commit 製作鏡像
通過docker build 製作鏡像
這兩種方式都是通過改進已有的鏡像來達到自己的目的。製作基礎鏡像,會在另外一篇文章「從零開始製作基礎鏡像」中介紹。
docker commit
docker commit 是往版本控制系統里提交一次變更。使用這種方式製作鏡像,本質上是運行一個基礎鏡像,然後在基礎鏡像上進行軟體安裝和修改。最後再將改動提交到版本系統中。
選擇基礎鏡像
基礎鏡像的選擇要結合自己的需求。可以選擇已有的應用鏡像來改造,也可以選擇Ubuntu,Debian,OpenSuse這類基礎系統鏡像
我們以ubuntu為例子來說明
步驟1:運行ubuntu 鏡像
docker run -i -t ubuntu /bin/bash
步驟2:安裝軟體並修改軟體配置, 比如:安裝apache2
apt-get -yqq update
apt-get -y install apache2
安裝完成後,對apache2進行配置和修改
步驟3:退出docker並保存鏡像
使用「exit」命令退出容器
運行docker comit 命令, 進行保存
docker commit 61412230ae46 own-apache2
docker commit 命令參數說明
命令格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS:
-a, --author= 提交的鏡像作者
-c, --change=[] Apply Dockerfile instruction to the created image, 沒用過
-m, --message= 提交時的說明文字
-p, --pause=true 在commit時,將container 暫停
CONTAINER:
可以使用container 的名字或者ID
REPOSITORY
指定鏡像倉庫,上述例子中,指定的是本地存儲
可以指定遠程鏡像倉庫,如docker hub。也可自建倉庫來存放image
TAG:
鏡像TAG
docker build
使用docker build創建鏡像需要編寫Dockerfile.
步驟:
編寫自己的Dcokerfile
運行docker build 命令打包鏡像
仍然以apache打包為例子。以下是Dockerfile的例子
FROM ubuntu:latest
MAINTAINER sky
#Add 163 mirror for apt
ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \ s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"]
編輯完成後,在與Dockerfile同一目錄下運行docker build 命令
docker build -t apache-img .
如果沒有命令出錯,docker build會持續運行直到鏡像創建完成
而創建的過程本質上是運行一個鏡像,然後在鏡像中按序執行在Dockerfile中的命令,直到執行結束。
如果中間有命令執行失敗,鏡像創建會停止。這時就需要看log,並修改Dockerfile,然後再次執行docker build
註:兩種鏡像創建方式的對比:
docker commit
docker build
難度相對容易,適合新手和對linux不熟悉的用戶相對難,要求有一定的linux和腳本基礎知識
文檔化
文檔化在通過其他文件來實現
Dockerfile本身就是比較好的文檔,可讀和可理解性比較強。也可配合其他文檔帶來詳細說明
升級,維護
後續升級和維護麻煩,需要再次運行鏡像並對內部軟體進行升級或者安裝新軟體增加特性
後續升級和維護會相對簡單,可以直接在dockerfile中更改並增加新特性
具體選擇哪種方式來製作鏡像需要結合實際情況來選擇
Dockerfile 關鍵字詳解
FROM
FROM用來指定基礎包。在上面的例子中,基礎包用的是ubuntu。
MAINTAINER
鏡像作者信息,或者維護人員信息
ADD
將文件拷貝到Container內文件系統對應的路徑
格式 ADD <src file> <dst file>
所有拷貝到Container中的文件和文件夾許可權為0755,uid和gid為0
如果需要修改owner用戶或者許可權,需要使用RUN進行修改
ADD文件,文件路徑要在docker build<PATH>中指定的<PATH>下
RUN
創建鏡像時執行
ENV
用來設置環境變數
EXPOSE
Container內部服務開啟的埠
主機上如果要使用,還需要在啟動Container時,做host-container的商品映射
使用EXPOSE後,一些自動化布署工具可以直接讀取這個信息,自動進行埠映射
EXPOSE可以有多條,指定多個埠
WORKDIR
切換工作目錄,可進行多次切換(相當於cd命令)
切換目錄對RUN,CMD,ENTRYPOINT有效
USER
執行container的用戶,如未指定,則默認使用root用戶
ENTRYPOINT
Container啟動時執行的命令,一個Dockerfile中只能有一條ENTRYPOINT
ENTRYPOINT沒有CMD的可替換特性
CMD
Container 啟動時執行的命令,一個Dockerfile 中只能有一條CMD命令,如果有多條則只執行最後一條CMD
如果有多條命令希望在啟動後執行,可以考慮使用shell 腳本
與ENTRYPOINT的區別
CMD的主要用途是為可執行的container提供默認命令
CMD在運行時是可替換的,比如
在ubuntu中,CMD指定的是/bin/bash。默認情況下運行ubuntu,container中的/bin/bash會被執行
如果使用docker run指定運行命令,那CMD會被替換掉
如:docker run ubuntu /bin/echo "this is a echo". 這時,container 啟動後會執行echo 而不是/bin/bash了
ENTRYPOINT是不會替換的,如果在ubuntu鏡像中加入ENTRYPOINT,那ENTRYPOINT在啟動後會先被執行
CMD可以為ENTRYPOINT來提供參數
例子:
FROM ubuntu:14.10
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
VOLUME
語法:VOLUME [PATH]
VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現數據共享或對容器數據的備份、恢復或遷移
可以將本地文件夾或者其他Container的文件夾掛載到Container中

㈢ Dockerfile中ENTRYPOINT 和 CMD的區別

在Docker的系統學習教程中我們了解到使用Dockerfile構建Docker鏡像為一個規范的方式,根據Dockerfile可以了解鏡像中安裝的組件的詳細內容。Dockerfile一般由四部分組成:第一,構建的基礎鏡像;第二,鏡像構建者的信息;第三,構建鏡像過程中鏡像層添加指令;第四,由該鏡像啟動容器時執行的程序。本篇文章中涉及到的ENTRYPOINT
和CMD
屬於Dockerfile中的最後一部分,這兩個Dockerfile指令是用來告知Docker後台程序啟動鏡像時需要執行的程序,兩者有細微的差別。下面將從兩者的異同以及兩者聯合使用的高級技巧方面對兩個指令進行詳解。

㈣ 如何使用Dockerfile構建鏡像

你好,使用方法如下:
Dockerfile結構
dockerfile由4部分信息組成:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# Base image to use, this must be set as the first line
FROM ubuntu

# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user [email protected]

# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
CMD /usr/sbin/nginx

其中#表注釋,可以標注一些說明性的文字。
FROM關鍵字指定鏡像的來源,默認為DockerHub,也可以寫私有倉庫的鏡像,例如:localhost:5000/centos:6.7,如果本地已經存在指定的鏡像名稱,則會從本地緩存直接獲取。MAINTAINER 指定鏡像的作者,之後為鏡像操作執行RUN、ADD等,最後是容器啟動時發起的指令。
Dockerfile中的指令
FROM: 指定鏡像名稱,格式為FROM <image> 或FROM <image>:<tag>,例如FROM ubuntu 或 FROM ubuntu:12.04
MAINTAINER: 鏡像作者 ,格式為 MAINTAINER <name>
RUN:格式為 RUN <command> 或 RUN ["executable", "param1", "param2"]。
前者將在 shell 終端中運行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條 RUN 指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 \ 來換行。
CMD:支持三種格式
1.CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
2.CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
3.CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。
EXPOSE:格式為 EXPOSE <port> [<port>...]。
告訴 Docker 服務端容器暴露的埠號,供互聯系統使用。在啟動容器時需要通過 -P,Docker 主機會自動分配一個埠轉發到指定的埠。
ENV:格式為 ENV <key> <value>。 指定一個環境變數,會被後續 RUN 指令使用,並在容器運行時保持。這就對應程序語言中的變數定義,可在需要的時候引用。例如:

1
2
3
4

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD:格式為 ADD <src> <dest>。
該命令將復制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 文件(自動解壓為目錄)。
COPY:格式為 COPY <src> <dest>。
復制本地主機的 <src>(為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。當使用本地目錄為源目錄時,推薦使用 COPY。
COPY和ADD的不同就是:ADD多了自動解壓和支持URL路徑的功能。
ENTRYPOINT:
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啟動後執行的命令,並且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
CMD和ENTRYPOINT比較:兩個命令都是只能使用一次,並且都是在執行docker run指令時運行,如果有多個,只執行最後一條。
兩者的不同在於參數的傳遞方式,如果在Dockerfile中定義如下指令

1

CMD echo hello



1

ENTRYPOINT ["echo","hello"]

那麼在運行命令docker run containerId echo hello時,指定了CMD的輸入結果為world,可以看出Dockerfile中指定的命令被覆蓋了,而指定了ENTRYPOINT時,輸出結果為hello echo world,可以看出指定的命令被作為ENTRYPOINT指定指令的參數了。

VOLUME:格式為 VOLUME ["/data"]。創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的數據等。不過此屬性在Dockerfile中指定並沒有什麼意義,因為沒有辦法指定本地主機的目錄。如果需要指定掛載點可以在執行docker run命令時指定:

1

docker run -it -v /home/fengzheng/ftp/:/data 859666d51c6d /bin/bash

USER:格式為 USER daemon。指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶。
當服務不需要管理員許可權時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員許可權可以使用 gosu,而不推薦 sudo。
WORKDIR:格式為 WORKDIR /path/to/workdir。為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如

1
2
3
4

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

則最終路徑為 /a/b/c。
ONBUILD:格式為 ONBUILD [INSTRUCTION]。
配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。
例如,Dockerfile 使用如下的內容創建了鏡像 image-A。

1
2
3
4

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基於 image-A 創建新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行ONBUILD 指令內容,等價於在後面添加了兩條指令。

1
2
3
4
5

FROM image-A

#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的鏡像,推薦在標簽中註明,例如 ruby:1.9-onbuild。
基於CentOS6.7並源碼安裝nginx
首先准備了nginx-1.9.9.tar.gz安裝包和CentOS6-Base-163.repo(163源),將這兩個文件放到同一目錄下,並在此目錄下創建名稱為Dockerfile的文件。之後在此文件中實現源替換、nginx編譯安裝、及一些依賴包的安裝,Dockerfile內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# this is a test ubuntu 12.04 image dockerfile
# Author:fengzheng

# Base image,this must be set as the first line
#localhost:5000/centos:6.7是我的私有倉庫的鏡像,可替換為centos:6.7(DockerHub中的鏡像)
FROM localhost:5000/centos:6.7

MAINTAINER fengzheng

# Commands to update the image

RUN mkdir /usr/nginx1.9.9
ADD nginx-1.9.9.tar.gz /usr/nginx1.9.9/
#RUN yum -y install tar
#RUN tar -zxvf /usr/nginx1.9.9/nginx-1.9.9.tar.gz
RUN cd /etc/yum.repos.d/ && mv CentOS-Base.repo CentOS-Base.repo.bak
ADD CentOS6-Base-163.repo /etc/yum.repos.d/
RUN cd /etc/yum.repos.d/ && mv CentOS6-Base-163.repo CentOS-Base.repo \
&& yum clean all && yum makecache \
&& yum -y install gcc \
&& yum -y install yum install -y pcre-devel \
&& yum -y install zlib zlib-devel \
&& yum -y install openssl openssl--devel \
&& cd /usr/nginx1.9.9/nginx-1.9.9/ && ./configure && make && make install

#如果設置daemon off; nginx無法啟動
#RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
# 啟動nginx 需進入/usr/local/nginx/sbin 執行./configure
CMD /bin/bash

最後執行命令"docker build -t nginx-centos:6.7 ."
其中.表示在當前目錄下搜索Dockerfile文件,-t參數指定鏡像名稱和tag。

㈤ 如何編寫 docker dockerfile

如何使用
Dockerfile用來創建一個自定義的image,包含了用戶指定的軟體依賴等。當前目錄下包含Dockerfile,使用命令build來創建新的image,並命名為edwardsbean/centos6-jdk1.7:
docker build -t edwardsbean/centos6-jdk1.7 .

Dockerfile關鍵字
如何編寫一個Dockerfile,格式如下:
# CommentINSTRUCTION arguments

FROM
基於哪個鏡像
RUN
安裝軟體用
MAINTAINER
鏡像創建者
CMD
container啟動時執行的命令,但是一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD.
CMD主要用於container時啟動指定的服務,當docker run command的命令匹配到CMD command時,會替換CMD執行的命令。如:
Dockerfile:
CMD echo hello world

運行一下試試:
edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd
hello world

一旦命令匹配:
edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd echo hello edwardsbean
hello edwardsbean

ENTRYPOINT
container啟動時執行的命令,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執行最後一條
ENTRYPOINT沒有CMD的可替換特性
USER
使用哪個用戶跑container
如:
ENTRYPOINT ["memcached"]
USER daemon

EXPOSE
container內部服務開啟的埠。主機上要用還得在啟動container時,做host-container的埠映射:
docker run -d -p 127.0.0.1:33301:22 centos6-ssh

container ssh服務的22埠被映射到主機的33301埠
ENV
用來設置環境變數,比如:
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8

ADD
將文件<src>拷貝到container的文件系統對應的路徑<dest>
所有拷貝到container中的文件和文件夾許可權為0755,uid和gid為0
如果文件是可識別的壓縮格式,則docker會幫忙解壓縮
如果要ADD本地文件,則本地文件必須在 docker build <PATH>,指定的<PATH>目錄下
如果要ADD遠程文件,則遠程文件必須在 docker build <PATH>,指定的<PATH>目錄下。比如:
docker build github.com/creack/docker-firefox

docker-firefox目錄下必須有Dockerfile和要ADD的文件
注意:使用docker build - < somefile方式進行build,是不能直接將本地文件ADD到container中。只能ADD
url file.
ADD只有在build鏡像的時候運行一次,後面運行container的時候不會再重新載入了。
VOLUME
可以將本地文件夾或者其他container的文件夾掛載到container中。
WORKDIR
切換目錄用,可以多次切換(相當於cd命令),對RUN,CMD,ENTRYPOINT生效
ONBUILD
ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行

㈥ dockerfile 基礎鏡像 有哪些

當想讓一個容器做兩件事情,或者使一個Docker鏡像包含來自兩個不同鏡像的依賴庫時,就需要知道每個鏡像的Dockerfile。本文介紹了如何通過docker history命令來對Docker鏡像進行反向工程,得到它們的Dockerfile,並組織到一個Dockerfile里然後build,從而實現想做的事情。

常言道,「不要重復發明輪子!」

在使用Docker時,構建自己的鏡像之前,最好在Docker Hub尋找一些可以直接使用的鏡像做練習。把軟體架構分布到一系列容器中,每一個容器只做一件事情,這樣的效果非常好。構建分布式應用的最好的基石是使用來自Docker Hub的官方鏡像,因為可以信任它們的質量。

在某些情況下,可能想讓一個容器做兩件不同的事情。而在另外一些情況下,可能想讓一個Docker鏡像包含來自兩個不同鏡像的依賴庫。如果有每個鏡像的Dockerfile,這是非常簡單的。將它們組織到一個Dockerfile里然後build就行。

然而,大多數時間都在使用Docker Hub上准備好的鏡像,不會有它們的源Dockerfile。我花時間找一個可以合並(或flatten)兩個不同Docker鏡像的工具,當然沒有它們的Dockerfile。也就是說在找一個能做下面這件事的東西:
image 1 --
\
---> merged_image_12
/
image 2 --

此前在GitHub上有兩個相關的討論(1、2),盡管它們都被關閉了。

這可能嗎?
那麼,是否存在工具能夠像這樣做嗎:docker merge image2 image2 merged_image?

沒有!
你甚至不可以用下面的方式來構建Dockerfile:
FROM image1
FROM image2

簡而言之,在一個Dockerfile里不能有多個基礎鏡像。

但是我需要這個功能!
唯一的解決辦法是取得這些鏡像的Dockerfile,然後把它們組織到一個文件中,再進行構建。那麼,我能在Docker Hub上獲得一個鏡像的Dockerfile嗎? 幸運的是可以。它不能離線獲取(譯註:原文是online,但顯然online時對於來自GitHub的自動構建鏡像是可以直接獲取的),但是你可以使用docker history命令,通過反向工程獲取。

怎麼來使用?
在你的機器上使用docker pull從Docker Hub下載鏡像。
docker pull image1
docker pull image2

然後使用docker history來取得構建這兩個容器時運行的命令。
docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile

接下來打開這兩個文件,你可以看到每個鏡像的命令堆棧。這是因為Docker鏡像通過層(閱讀更多)的方式來構建。即你在Dockerfile中鍵入的每一個命令所構建的新鏡像,都是在之前的命令產生的鏡像之上。所以你可以對鏡像進行逆向工程。

限制
不能對鏡像進行反向工程的唯一場景,是鏡像的維護者在他的Dockerfile中使用了ADD或COPY命令。你會看到這樣一行:
ADD file:1ac56373f7983caf22
或 ADD dir:cf6fe659e9d21535844
這是因為不知道維護者在他自己的機器上,包括鏡像里使用了什麼本地文件。

㈦ dockerfile CMD執行多條命令且需要支持環境變數

運行時機不太一樣。
RUN是在Build時運行的,先於CMD和ENTRYPOINT。Build完成了,RUN也運行完成後,再運行CMD或者ENTRYPOINT。
ENTRYPOINT和CMD的不同點在於執行docker run時參數傳遞方式,CMD指定的命令可以被docker run傳遞的命令覆蓋,例如,如果用CMD指定:
...
CMD ["echo"]

然後運行
docker run CONTAINER_NAME echo foo

那麼CMD里指定的echo會被新指定的echo覆蓋,所以最終相當於運行echo foo,所以最終列印出的結果就是:
foo

而ENTRYPOINT會把容器名後面的所有內容都當成參數傳遞給其指定的命令(不會對命令覆蓋),比如:
...
ENTRYPOINT ["echo"]

然後運行
docker run CONTAINER_NAME echo foo

則CONTAINER_NAME後面的echo foo都作為參數傳遞給ENTRYPOING里指定的echo命令了,所以相當於執行了
echo "echo foo"

最終列印出的結果就是:
echo foo

另外,在Dockerfile中,ENTRYPOINT指定的參數比運行docker run時指定的參數更靠前,比如:
...
ENTRYPOINT ["echo", "foo"]

執行
docker run CONTAINER_NAME bar

相當於執行了:
echo foo bar

列印出的結果就是:
foo bar

Dockerfile中只能指定一個ENTRYPOINT,如果指定了很多,只有最後一個有效。
執行docker run命令時,也可以添加-entrypoint參數,會把指定的參數繼續傳遞給ENTRYPOINT,例如:
...
ENTRYPOINT ["echo","foo"]

然後執行:
docker run CONTAINER_NAME bar #注意沒有echo

那麼,就相當於執行了echo foo bar,最終結果就是
foo bar

㈧ docker build 能不叫 dockerfile嗎

Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為注釋,每一行只支持一條指令,每條指令可以攜帶多個參數。
Dockerfile的指令根據作用可以分為兩種,構建指令和設置指令。構建指令用於構建image,其指定的操作不會在運行image的容器上執行;設置指令用於設置image的屬性,其指定的操作將在運行image的容器中執行。

㈨ dockerfile是什麼類型文件

Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。它們簡化了從頭到尾的流程並極大的簡化了部署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和參數。其產出為一個新的可以用於創建容器的鏡像。

java">#
#VERSION2-EDITION1
#Author:docker_user
#Commandformat:Instruction[arguments/command]..

#1、第一行必須指定基礎鏡像信息
FROMubuntu

#2、維護者信息
[email protected]

#3、鏡像操作指令
RUNecho"debhttp://archive.ubuntu.com/ubuntu/raringmainuniverse">>/etc/apt/sources.list
RUNapt-getupdate&&apt-getinstall-ynginx
RUNecho" daemonoff;">>/etc/nginx/nginx.conf

#4、容器啟動執行指令
CMD/usr/sbin/nginx

Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令、容器啟動執行指令。
一開始必須要指明所基於的鏡像名稱,接下來一般會說明維護者信息。
後面則是鏡像操作指令,例如 RUN 指令。RUN 指令將對鏡像執行跟隨的指令。每執行一條RUN 指令,鏡像添加新的一層,並提交
最後是 CMD 指令,來指明運行容器時的操作命令。

FROM 指令:格式: FROM <images> 或者 FROM<image>:<tag>。第一條指令必須是 FROM 指令。並且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個 FROM 指令。
MAINTAINER 指令:指定維護者信息。
RUN 指令:格式:RUN <command> 或者 RUN ["executable","param1","param2"]

另外通過直接下載程序鏡像(Nginx)也可以創建一個容器,並將容器運行起來。

(1) 從中央倉庫下載鏡像:docker pull nginx:1.9
(2) docker run 命令啟動容器,docker run -d -p 8080:80 nginx:1.9,把容器內的nginx的80埠,映射到當前伺服器(Centos系統的ip地址)的8080埠,我當前伺服器的ip是192.168.1.10,這樣在瀏覽器輸入192.168.1.10:8080/,發現nginx已啟動。
(3) 再啟動多一個容器,docker run -d -p 8085:80 nginx:1.9,瀏覽器輸入http:/192.168.1.10:8085/,就可以看到另外一個nginx已啟動。

閱讀全文

與dockerfile命令為兩類相關的資料

熱點內容
hpc編譯器論文 瀏覽:813
javac編譯子目錄下所有文件 瀏覽:429
卡友幫幫團是什麼app 瀏覽:241
vnc啟動命令 瀏覽:373
哺乳十電影 瀏覽:629
貴州java編譯器 瀏覽:645
歐美電影免費看平台 瀏覽:286
台灣紅羊影視作品有哪些 瀏覽:906
農行app上怎麼查詢卡號 瀏覽:891
浩天酒道館網是什麼app 瀏覽:212
永久不收費的電影網站 瀏覽:120
兒女傳奇全集目錄 瀏覽:522
文學評論pdf 瀏覽:410
linux源代碼導讀 瀏覽:702
百戰程序員6000集下載 瀏覽:146
蘋果和安卓手機之間怎麼克隆 瀏覽:465
模糊聚類演算法研究 瀏覽:108
寶德伺服器硬碟亮紅燈如何解決 瀏覽:696
androidlibgdx下載 瀏覽:409
聯盟pdf下載 瀏覽:793