Dockerfile 语法

Dockerfile 语法

Dockerfile语法由两部分构成,注释和命令+参数

1、FROM [:] [AS ]: 设置基础镜像;

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

 

FROM <image>

FROM <image>:<tag>

FROM <image>@<digest>

#注:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

例如:

FROM alpine:latest

 

 

2、MAINTAINER: 维护者信息;

格式: MAINTAINER <authtor`s detail> 一般约定俗成地使用坐着名称及邮件地址。

例如:MAINTAINER david "linzhi.luo@avazu.net"

 

 

3、ENV 设置环境变量

格式:

ENV <key> <value>

ENV <key>=<value> ...

 

注意:ENV \ =: 设置容器环境变量。可以使用docker run --env =修改环境变量

ENV myName John Doe

ENV myDog Rex The Dog

ENV myCat fluffy

 

 

4、WORKDIR: 工作目录,类似于cd

格式:

WORKDIR /path/to/workdir

示例:

WORKDIR /a (这时工作目录为/a)

WORKDIR b (这时工作目录为/a/b)

注:

  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、

ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用

docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

 

 

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

格式:

RUN  ["executable", "param1", "param2"]:

注意:executable 是命令,后面的 param是参数

执行shell脚本。进来少使用RUN,因为没执行一次 docker就会增加一层只读层。

RUN /bin/bash -c 'source $HOME/.bashrc; \

echo $HOME'

等同于

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

等同于

RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]

注意:

 RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

 

 

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

格式:

CMD ["executable","param1","param2"] (执行可执行文件,优先)

CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)

CMD command param1 param2 (执行shell内部命令)

注意:DockerFile中只有一个CMD,多于一个将执行最后一个。它的意思差不多就是启动容器后执行的默认命令。

示例:

CMD echo "This is a test." | wc -

CMD ["/usr/bin/wc","--help"]

 

 

7、LABEL 为镜像添加元数据

格式:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL = = ... : 镜像标签

LABEL "com.example.vendor"="ACME Incorporated"

LABEL com.example.label-with-value="foo"

LABEL version="1.0"

LABEL description="This text illustrates \

that label-values can span multiple lines."

 

 

8、EXPOSE 用来指定端口,使容器内的应用可以通过端口和外界交互。

格式:

EXPOSE <port> [<port>...]

注意:

  EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或 通过-P 参数来发布EXPOSE导出的所有端口

 

EXPOSE [/...]: 暴露容器的端口

EXPOSE 80/tcp

EXPOSE 80/udp

 

 

9、 ADD: 将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源

ADD [--chown=:] ... \ [--chown=:] ["",... ""]: 拷贝一个新文件,或者文件夹或者远程文件的 URLS,把他们添加到,镜像的文件系统中。 为绝对路径或者由WORKDIR定义的相对路径。

ADD hom* /mydir/         # 添加所有以 "hom" 开头的文件

ADD hom?.txt /mydir/     # ? 替换任何单个的字符, e.g., "home.txt"

 

ADD test relativeDir/    # 添加 "test" 到 `WORKDIR`/relativeDir/

ADD test /absoluteDir/   # 添加 "test" 到 /absoluteDir/

 

ENV cpath /home/zb

ARG zbpath=/home/lala

WORKDIR $cpath

ADD **.jpg $cpath

ADD **.jpg $zbpath

 

# 添加含有特殊字符的文件或者文件夹时如“[]”,需要遵循 golang 的规则将它们进行转义,以防它们为匹配模式

ADD arr[[]0].txt /mydir/ # 复制一个文件名为 "arr[0].txt" 到 /mydir/

 

# 通过 --chown 指定添加文件或者文件夹的用户名和组名

ADD --chown=55:mygroup files* /somedir/

ADD --chown=bin files* /somedir/

ADD --chown=1 files* /somedir/

ADD --chown=10:11 files* /somedir/

 

 

10、COPY 功能类似于ADD,但是不会自动解压文件,也不能访问网络资源。

格式:

copy <src> ... <dest> 或者

COPY [--chown=:] ... / [--chown=:] ["<src>",... "dest"]

<src>:要复制的源文件或目录,支持使用通配符

<dest>:目标路径,即正在创建的 image的文件系统路径;建议为<dest>使用绝对路径,否则,copy指定则以workdir为其起始路径;

注意:在路径中有恐怖字符时,通常使用第二种格式。

文件复制准则

A、<src>必须是build上下文中的路径,不能是其父目录中的文件;

B、如果<src> 是目录,则内部文件或者子目录会被递归复制,但<src>目录自身不会被复制;

C、如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以 / 结尾;

D、如果<dest>事先不存在,它将会自动被创建,这包括其父目录路径;

注意:需要复制的目录一定要放在Dockerfile文件的同级目录下;

原因:因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。

 

 

 

11、ENTRYPOINT: 配置容器,使其可执行化。配合CMD可以省略“application”,只适用参数

格式:

ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)

ENTRYPOINT command param1 param2 (shell内部命令)

示例:

FROM ubuntu

ENTRYPOINT ["top", "-b"]

CMD ["-c"]

注:

   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

 

ENTRYPOINT与CMD的比较

1.当有多个ENTRYPOINT CMD它们都只执行最后一个

2.当容器为一个可执行文件时应该定义ENTRYPOINT

3.当同时定义ENTRYPOINT 和 CMD时,CMD为ENTRYPOINT的默认参数

4.当docker执行run命令时,在里面指定CMD时,CMD将会被重写。

注意:entrpoint里全部必须是双引号,而不能是单引号

 

 

12、VOLUME: 指定持久化目录

格式:

VOLUME ["/path/to/dir"]

示例:

VOLUME ["/data"]

VOLUME ["/var/www", "/etc/log"]

注:

  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

1 卷可以容器间共享和重用

2 容器并不一定要和其它容器共享卷

3 修改卷后会立即生效

4 对卷的修改不会对镜像产生影响

5 卷会一直存在,直到没有任何容器在使用它

 

RUN mkdir /data1

RUN touch /data1/2a.txt

VOLUME /data1

 

# 通过命令 docker inspect hasVvolume

"Mounts": [

           {

               "Type": "volume",

               "Name": "0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321",

               "Source": "/var/lib/docker/volumes/0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321/_data",

               "Destination": "/data1",

               "Driver": "local",

               "Mode": "",

               "RW": true,

               "Propagation": ""

           }

       ]

===============================================================

# 也可以通过 docker run -v 来挂载共享目录,这时 Source 指出 -v 时定义的目录

"Mounts": [

       {

               "Type": "bind",

               "Source": "/Users/zhangbo/Desktop/data1",

               "Destination": "/data1",

               "Mode": "",

               "RW": true,

               "Propagation": "rprivate"

           }

       ]

 

容器中共享目录

# 使用 --volumes-from,达到容器中文件夹共享

docker run -itd --name noVvolume-v-1 --volumes-from noVvolume-v 48cd9e43b6a9

 

 

13、USER: 设置启动容器的用户名或UID,默认是root用户。后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,docker run时,可以通过-u参数覆盖指定的用户

示例

USER daemon

 

 

 

14、ARG: 指定传递给构建运行时的变量

ARG [=] : docker file中的变量

FROM busybox

ARG user1="zhang bo"

ARG buildno

RUN echo $user1

RUN echo $buildno

输出信息:

Step */* : RUN echo $user1

---> Running in a56a602a8f87

zhang bo

Removing intermediate container a56a602a8f87

---> 3e9c6ec19129

Step */* : RUN echo $buildno

---> Running in 6598768a1080

 

预制变量

FROM ubuntu

ARG CONT_IMG_VER

ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}

RUN echo $CONT_IMG_VER

 

# 可以通过 --build-arg 标签进行给定的预制的变量。--build-arg <varname>=<value>

docker run --build-arg CONT_IMG_VER=******* .

 

 

15、ONBUILD: 设置镜像触发器

 

 

docker 常用命令如下

管理命令:

 container   管理容器

 image       管理镜像

 network     管理网络

 node        管理Swarm节点

 plugin      管理插件

 secret      管理Docker secrets

 service     管理服务

 stack       管理Docker stacks

 swarm       管理Swarm集群

 system      查看系统信息

 volume      管理卷

 

 如:docker container ls 显示所有容器

普通命令:

 attach     进入一个运行的容器

 build      从一个DockerFile构建镜像

 commit     从容器创建一个镜像

 cp          从容器和主机文件系统之间拷贝文件

 create      创建一个容器

 diff        检查容器文件系统上的更改

 events      从服务器获取实时事件

 exec        在正在运行的容器中运行命令

 export      将容器的文件系统导出为tar存档

 history     显示镜像的历史记录

 images      查看镜像列表

 import      从归档文件中创建镜像

 info        显示系统范围的信息

 inspect     返回Docker对象的低级信息

 kill        kill运行中的容器

 load        从存档或者STDIN加载镜像

 login       登陆docker镜像仓库

 logout      退出docker镜像仓库

 logs        获取一个容器的日志

 pause       暂停一个或多个容器中的所有进程

 port        查看端口映射或容器的特定映射列表

 ps          查看容器列表

 pull        从镜像仓库拉取镜像

 push        将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

 rename      重命名容器

 restart     重启容器

 rm          删除容器

 rmi         删除镜像

 run         创建一个新的容器并运行一个命令

 save        将指定镜像保存成 tar 归档文件

 search      从Docker Hub搜索镜像

 start       启动容器

 stats       实时显示容器资源使用情况的统计信息

 stop       停止容器

 tag         标记本地镜像,将其归入某一仓库

 top         展示一个容器中运行的进程

 unpause     恢复容器中所有的进程

 update      更新容器配置

 version     显示Docker的版本信息

 wait        阻塞直到容器停止,然后打印退出代码

 

 如:docker images 显示所有镜像

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值