Docker学习(三)

Dockerfile 命令

1.ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder 

2.CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

3.ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

4.ENV 

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

# Usage: ENV key value
ENV SERVER_WORKS 4

5.EXPOSE

EXPOSE用来指定容器端口,docker run -p port用来映射宿主机器随机端口,docker run -p port1:port2用来映射宿主机器指定端口(port1:宿主,port2:容器)。 

# Usage: EXPOSE [port] EXPOSE 8080
# 容器端口  
EXPOSE port1  
# 映射宿主机器的随机端口  
docker run -p port1 image  
# 映射到宿主机器上的某个指定端口号
docker run -p port1:port2 image  
  
# 多个容器端口  
EXPOSE port1 port2 port3  
# 映射宿主机器的多个随机端口  
docker run -p port1 -p port2 -p port3 image  
# 映射到宿主机器上的多个指定端口号
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image  

6.FROM

FROM命令可能是最重要的Dockerfile命令。该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像,如果基础镜像没有被发现,
Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

# Usage: FROM [image name]
FROM ubuntu 

7.MAINTAINER

建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

# Usage: MAINTAINER [name]
MAINTAINER authors_name 

8.RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

# Usage: RUN [command]
RUN aptitude install -y riak

9.USER

USER命令用于设置运行容器的UID。

# Usage: USER [UID]
USER 751

10.VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

11.WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

# Usage: WORKDIR /path
WORKDIR ~/

12.ONBUILD

ONBUILD 指令能为镜像添加触发器(trigger)。当一个镜像被用做其他镜像的基础镜像时,该镜像中的触发器将会被执行。
ONBUILD 指令会按照在父镜像中指定的顺序执行,并且只能被`继承一次`。
且有些指令是不可以用在 ONBUILD 指令中的,包括 FROM, MAINTAINER 和 ONBUILD 本身。

ONBUILD <DOCKERFILE 指令> <content>

13.ADD和COPY的区别

Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的。

COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。
而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。

满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。



1. COPY指令

COPY指令能够将构建命令所在的主机本地的文件或目录,复制到镜像文件系统。

exec格式用法(推荐):
COPY ["<src>",... "<dest>"],推荐,特别适合路径中带有空格的情况

shell格式用法:
COPY <src>... <dest>



2. ADD指令
ADD指令不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
所以,可以认为ADD是增强版的COPY,支持将远程URL的资源加入到镜像的文件系统。


exec格式用法(推荐):
ADD ["<src>",... "<dest>"],特别适合路径中带有空格的情况

shell格式用法:
ADD <src>... <dest>


说明,对于从远程URL获取资源的情况,由于ADD指令不支持认证,如果从远程获取资源需要认证,则只能使用RUN wget或RUN curl替代。
另外,如果源路径的资源发生变化,则该ADD指令将使Docker Cache失效,Dockerfile中后续的所有指令都不能使用缓存。因此尽量将ADD指令放在Dockerfile的后面。



3. COPY指令和ADD指令的用法非常相似,具体注意事项如下:
源路径可以有多个
源路径是相对于执行build的相对路径
源路径如果是本地路径,必须是build上下文中的路径
源路径如果是一个目录,则该目录下的所有内容都将被加入到容器,但是该目录本身不会
目标路径必须是绝对路径,或相对于WORKDIR的相对路径
目标路径如果不存在,则会创建相应的完整路径
目标路径如果不是一个文件,则必须使用/结束
路径中可以使用通配符
4. 读取URL远程资源

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

事实上,当要读取URL远程资源的时候,并不推荐使用ADD指令,而是建议使用RUN指令,在RUN指令中执行wget或curl命令。

 

posted @ 2018-07-16 16:05  Coufusion  阅读(84)  评论(0)    收藏  举报