Docker的Dockerfile脚本基本使用指南
<p>Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。</p><p><strong>Dockerfile 语法<br /></strong>在我们深入讨论Dockerfile之前,让我们快速过一下Dockerfile的语法和它们的意义。<br />什么是语法?<br />非常简单,在编程中,语法意味着一个调用命令,输入参数去让应用执行程序的文法结构。这些语法被规则或明或暗的约束。程序员遵循语法规范以和计算机 交互。如果一段程序语法不正确,计算机将无法识别。Dockerfile使用简单的,清楚的和干净的语法结构,极为易于使用。这些语法可以自我释义,支持注释。</p>
<p><strong>Dockerfile 语法示例<br /></strong>Dockerfile语法由两部分构成,注释和命令+参数<br />一个简单的例子:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode228"><br /># Print "Hello docker!"<br />RUN echo "Hello docker!"<br /></div></p>
<p><strong>Dockerfile 命令<br /></strong>Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。</p>
<p><strong>FROM 命令<br /></strong><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode229"><br />FROM <image><br /></div><br />或<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode230"><br />FROM <image>:<tag><br /></div><br />这个设置基本的镜像,为后续的命令使用,所以应该作为Dockerfile的第一条指令。<br />比如:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode231"><br />FROM ubuntu<br /></div><br />如果没有指定 tag ,则默认tag是latest,如果都没有则会报错。</p>
<p><strong>RUN 命令<br /></strong>RUN命令会在上面FROM指定的镜像里执行任何命令,然后提交(commit)结果,提交的镜像会在后面继续用到。<br />两种格式:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode232"><br />RUN <command> (the command is run in a shell - `/bin/sh -c`)<br /></div><br />或:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode233"><br />RUN ["executable", "param1", "param2" ... ](exec form)<br /></div><br />RUN命令等价于:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode234"><br />docker run image command<br />docker commit container_id<br /></div></p>
<p><br /><strong>注释<br /></strong>使用 # 作为注释<br />如:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode235"><br /># Memcached<br />#<br /># VERSION 1.0</p>
<p># use the ubuntu base image provided by dotCloud<br />FROM ubuntu</p>
<p># make sure the package repository is up to date<br />RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list<br />RUN apt-get update</p>
<p># install memcached<br />RUN apt-get install -y memcached<br /></div></p>
<p>MAINTAINER 命令<br />MAINTAINER <name><br />MAINTAINER命令用来指定维护者的姓名和联系方式<br />如:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode236"><br />MAINTAINER Guillaume J. Charmes, guillaume@dotcloud.com<br /></div></p>
<p><strong>ENTRYPOINT 命令<br /></strong>有两种语法格式,一种就是上面的(shell方式):<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode237"><br />ENTRYPOINT cmd param1 param2 ...<br /></div><br />第二种是 exec 格式:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode238"><br />ENTRYPOINT ["cmd", "param1", "param2"...]<br /></div><br />如:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode239"><br />ENTRYPOINT ["echo", "Whale you be my container"]<br /></div><br />ENTRYPOINT 命令设置在容器启动时执行命令<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode240"><br />root@tankywoo-docker:~# cat Dockerfile<br />FROM ubuntu<br />ENTRYPOINT echo "Welcome!"</p>
<p>root@tankywoo-docker:~# docker run 62fda5e450d5<br />Welcome!<br /></div></p>
<p><strong>USER 命令<br /></strong>比如指定 memcached 的运行用户,可以使用上面的 ENTRYPOINT 来实现:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode241"><br />ENTRYPOINT ["memcached", "-u", "daemon"]<br /></div><br />更好的方式是:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode242"><br />ENTRYPOINT ["memcached"]<br />USER daemon<br /></div></p>
<p><strong>EXPOSE 命令<br /></strong>EXPOSE 命令可以设置一个端口在运行的镜像中暴露在外<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode243"><br />EXPOSE <port> [<port>...]<br /></div><br />比如memcached使用端口 11211,可以把这个端口暴露在外,这样容器外可以看到这个端口并与其通信。<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode244"><br />EXPOSE 11211<br /></div><br />一个完整的例子:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode245"><br /># Memcached<br />#<br /># VERSION 2.2</p>
<p># use the ubuntu base image provided by dotCloud<br />FROM ubuntu</p>
<p>MAINTAINER Victor Coisne victor.coisne@dotcloud.com</p>
<p># make sure the package repository is up to date<br />RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list<br />RUN apt-get update</p>
<p># install memcached<br />RUN apt-get install -y memcached</p>
<p># Launch memcached when launching the container<br />ENTRYPOINT ["memcached"]</p>
<p># run memcached as the daemon user<br />USER daemon</p>
<p># expose memcached port<br />EXPOSE 11211<br /></div><br />上面是官方例子,国内建议换成163或sohu的源,不然太慢了。<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode246"><br />root@tankywoo-docker:~# docker build -t tankywoo- < dck <br />Uploading context2.56 kB<br />Uploading context<br />Step 0 : FROM ubuntu<br /> ---> 99ec81b80c55<br />Step 1 : MAINTAINER Victor Coisne victor.coisne@dotcloud.com<br /> ---> Using cache<br /> ---> 2b58110877f6<br />Step 2 : RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list<br /> ---> Running in f55a4a8bb069<br /> ---> d48c6a965398<br />Step 3 : RUN apt-get update<br /> ---> Running in da091a1dd6e7<br />Ign http://mirrors.163.com precise InRelease<br />Get:1 http://mirrors.163.com precise Release.gpg </p>
<p>....</p>
<p>Processing triggers for libc-bin (2.19-0ubuntu6) ...<br />Processing triggers for ureadahead (0.100.0-16) ...<br /> ---> 2886671b5b86<br />Step 5 : ENTRYPOINT ["memcached"]<br /> ---> Running in e8aeeab92cb6<br /> ---> 7148293a4053<br />Step 6 : USER daemon<br /> ---> Running in 288766b19606<br /> ---> 235e7f630ffa<br />Step 7 : EXPOSE 11211<br /> ---> Running in c6f881b9d51f<br /> ---> 666c5d65f396<br />Successfully built 666c5d65f396<br />Removing intermediate container f55a4a8bb069<br />Removing intermediate container da091a1dd6e7<br />Removing intermediate container f23631d3d45a<br />Removing intermediate container e8aeeab92cb6<br />Removing intermediate container 288766b19606<br />Removing intermediate container c6f881b9d51f<br /></div></p>
<p><strong>ENV 命令<br /></strong>用于设置环境变量<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode247"><br />ENV <key> <value><br /></div><br />设置了后,后续的RUN命令都可以使用。<br />使用此dockerfile生成的image新建container,可以通过 docker inspect 看到这个环境变量:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode248"><br />root@tankywoo-docker:~# docker inspect 49bfc7a9817f<br /> ...<br /> "Env": [<br /> "name=tanky",<br /> "HOME=/",<br /> "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"<br /> ],<br /> ...<br /></div><br />里面的name=tanky就是设置的。<br />也可以通过在docker run时设置或修改环境变量:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode249"><br />docker run -i -t --env name="tanky" ubuntu:newtest /bin/bash<br /></div></p>
<p><br /><strong>ADD 命令<br /></strong>从src复制文件到container的dest路径:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode250"><br />ADD <src> <dest><br /></div><br /><src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url<br /><dest> 是container中的绝对路径<br />VOLUME 命令<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode251"><br />VOLUME ["<mountpoint>"]<br /></div><br />如:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode252"><br />VOLUME ["/data"]<br /></div><br />创建一个挂载点用于共享目录</p>
<p><br /><strong>WORKDIR 命令<br /></strong><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode253"><br />WORKDIR /path/to/workdir<br /></div><br />配置RUN, CMD, ENTRYPOINT 命令设置当前工作路径<br />可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令<br />比如:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode254"><br />WORKDIR /a WORKDIR b WORKDIR c RUN pwd<br /></div><br />其实是在 /a/b/c 下执行 pwd</p>
<p><strong>CMD 命令<br /></strong>有三种格式:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode255"><br />CMD ["executable","param1","param2"] (like an exec, preferred form)<br />CMD ["param1","param2"] (as default parameters to ENTRYPOINT)<br />CMD command param1 param2 (as a shell)<br /></div><br />一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效。</p>
頁:
[1]