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

轻松玩转虚拟机套娃! 在Hyper-V中开启嵌套虚拟化的技巧
有办法在虚拟机中创建虚拟机吗?答案是肯定的,在虚拟机中运行虚拟机是可能的,我们将其称为嵌套虚拟化,下面我们就来看看详细操作方法2025-02-19
龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)
本文主要介绍了安装和配置AnolisOS 23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,具有一定的参考价值,感兴趣的可以了解一下2025-01-20
在处理文件拷贝复制到VMware虚拟机中的任务时,有多种方法可以实现文件的高效传输,使用这些方法,可以在不同的操作系统和环境下,实现文件的快速、安全迁移,详细请看下文2024-09-24
统信 UOS V20 桌面专业版(1070u1)正式发布,支持微信扫码登录、应用窗口缩略图,海量功能修复,详细请看下文介绍2024-08-08
怎么看自己IP地址? 不同的操作系统中查看路由器的IP地址的方法
在互联网上进行网络连接,每个设备都有一个唯一的标识,即IP地址,本文介绍了如何在不同平台上查找路由器的IP地址,包括Windows、Mac、iPhone、iPad、Android、Chrome OS和2024-07-16
很多人在使用虚拟机系统的时候,经常对虚拟机的运行速度不甚满意,甚至经常很恼火,虚拟机速度慢有很多原因,每个人需要根据自己的情况具体分析,本文根据笔者的使用经验将2024-02-21
使用虚拟机的时候,遇到了错误,想要把错误的代码或是运行情况复制粘贴到Windows的网上论坛区求助大神,该怎么操作呢?详细请看下文介绍2024-02-21
统信UOS V20桌面专业版(1060)11月更新发布(附更新内容汇总)
国产桌面操作系统统信 UOS V20 专业版(1060)11月更新发布,这是统信 UOS V20 专业版(1060)2023 年度最后一次更新,下面我们就来看看详细的更新内容2023-12-01
统信 UOS 将推 Rust 版 Bash 命令行工具 utshell(附下载地址)
统信 UOS 服务器版将于不久后推出 Rust 版 Bash,名为 utshell,旨在突破传统 Shell 所面临的安全限制,详细请看下文介绍2023-09-20
UOS开机进入busybox界面怎么办 uos无法进入桌面的解决办法
UOS开机进入busybox界面怎么办?UOS系统开机黑屏进入busybox界面了,该怎么办呢?下面我们就来看看uos无法进入桌面的解决办法2023-09-06









最新评论