Dockerfile常见命令
Dockerfile结构
Dockerfile的结构分成了若干部分,每个部分之间的先后顺序有明确的要求:
部分 | 命令 |
---|---|
基础镜像信息 | FROM |
维护者信息 | MAINTAINER |
镜像操作指令 | RUN 、COPY 、ADD 、EXPOSE 、WORKDIR 、ONBUILD 、USER 、VOLUME 等 |
启动时命令 | CMD , ENTRYPOINT |
Dockerfile示例
# Dockerfile for apollo-adminservice
# 1. Copy apollo-adminservice-${VERSION}-github.zip to current directory
# 2. Build with: docker build -t apollo-adminservice .
# 3. Run with: docker run -p 8090:8090 -d -v /tmp/logs:/opt/logs --name apollo-adminservice apollo-adminservice
FROM openjdk:8-jre-alpine
MAINTAINER ameizi <sxyx2008@163.com>
ENV VERSION 1.5.0-SNAPSHOT
ENV SERVER_PORT 8090
# DataSource Info
ENV DS_URL ""
ENV DS_USERNAME ""
ENV DS_PASSWORD ""
RUN echo "http://mirrors.aliyun.com/alpine/v3.8/main" > /etc/apk/repositories \
&& echo "http://mirrors.aliyun.com/alpine/v3.8/community" >> /etc/apk/repositories \
&& apk update upgrade \
&& apk add --no-cache procps unzip curl bash tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
ADD apollo-adminservice-${VERSION}-github.zip /apollo-adminservice/apollo-adminservice-${VERSION}-github.zip
RUN unzip /apollo-adminservice/apollo-adminservice-${VERSION}-github.zip -d /apollo-adminservice \
&& rm -rf /apollo-adminservice/apollo-adminservice-${VERSION}-github.zip \
&& sed -i '$d' /apollo-adminservice/scripts/startup.sh \
&& chmod +x /apollo-adminservice/scripts/startup.sh \
&& echo "tail -f /dev/null" >> /apollo-adminservice/scripts/startup.sh
EXPOSE $SERVER_PORT
CMD ["/apollo-adminservice/scripts/startup.sh"]
注释
Dockerfile中使用#
进行行注释。
ADD 复制文件
格式:
ADD <src> <dest>
从src
复制文件到容器中的dest
。
注意:
src
可以是文件、目录、URL或压缩包,但是必须在构建上下文也就是Dockerfile所在的目录中dest
以/
结尾,则认为src
是一个目录;dest
不以/
结尾,则认为src
是一个文件。- 如果
src
是可识别的压缩包格式(gzip, bzip2, xz),则Docker会自动解压到容器的指定dest
,dest
中重名的文件不会被覆盖。 - 如果指定的
dest
不存在,则会自动创建dest
(含路径中的任何目录),新创建的文件和目录的模式为755
,UIG和GID都是0。
ARG 设置构建参数
ARG
设置构建时的环境变量,这些指定的参数在容器运行时不再有用。
示例
ARG build # 声明一个构建参数,但没有赋缺省值
ARG webapp_user=wasuser # 声明一个构建参数并指定缺省值
在docker build
命令构建镜像时,通过--build-arg
指定构建参数的值,例如:
docker build --build-arg build=12345 -t darren/test_image .
此时构建Dockerfile中使用到的build
的实际值是12345
,而webapp_user
的实际值是其缺省值。
CMD 容器启动命令
CMD
指定容器启动时执行的一条命令。
不同于RUN
命令,RUN
指令指定镜像被构建时要执行的命令,CMD
指定容器启动时要执行的命令。
每个Dockerfile只有一个CMD
命令,如果指定了多条CMD
命令,则只有最后一条会被执行。
启动容器时如果通过命令行指定了运行的命令,将会覆盖Dockerfile中指定的CMD
命令。
Docker推荐使用数组语法设置要执行的命令:
CMD ["/bin/bash", "-l"]
COPY 复制文件
COPY
类似于ADD
:
格式:
COPY <src> <dest>
注意:
COPY
不支持URL和压缩包。- 如果
src
是一个目录,则将其中的所有文件拷贝到dest
,而不含src
本身; dest
必须是一个绝对路径- 该指令创建的文件或目录的UID和GID都是0
- 复制时保留被拷贝目录/文件的元数据
ENTRYPOINT 入口点
与CMD
指令类似,同样指定容器启动时执行的命令。
docker run
命令中指定的任何参数都会被当做参数再次传递给ENTRYPOINT
指定的命令。
格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command arg1 arg2
示例:
在Dockerfile中:
ENTRYPOIINT ["/usr/sbin/nginx"]
在docker run
命令中:
docker run -t -i darren/test_image -g "daemon off;"
其中的参数-g "daemon off;"
会传递给ENTRYPOINT
指定的命令,接在ENTRYPOINT
之后,因此,最终实际在启动容器时执行的相当于ENTRYPOINT
指令:
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
其含义是前台进程的形式运行Nginx守护进程。
当ENTRYPOINT
和CMD
同时使用时,所有命令行中指定的参数会传递给ENTRYPOINT
指令,覆盖CMD
指定的参数;当命令行没有额外指定参数时,则ENTRYPOINT
以CMD
指定的参数作为默认的输入。
示例:
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
此时可以在docker run
命令中显示指定参数从而修改ENTRYPOINT
指令的参数,或者使用CMD
传给ENTRYPOINT
指令的参数,相当于/usr/sbin/nginx -h
,即显示Nginx的帮助。
ENV 设置环境变量
ENV
设置环境变量,设置的环境变量在容器运行时可以在容器内获取和使用,后续的RUN
指令等可以使用ENV
指令设置的环境变量。
示例:
- 一次定义多个环境变量
ENV RVM_PATH=/home/rvm RVM_ARCHFLAGS="-arch amd64"
- 使用环境变量
ENV JAVA_HOME /path/to/java
WORKDIR $JAVA_HOME
ENV
指令指定的环境变量会保存到构建的所有容器中,例如Linux容器中通过env
命令来查看容器运行时的环境变量。
docker run
命令中通过-e
选项传递的环境变量只对该命令启动的容器当次运行生效。
EXPOSE 声明暴露的端口
声明容器对外暴露的端口号:
EXPOSE <port1>
EXPOSE <port1> <port2> <port3>
运行时容器真实暴露的端口以命令行中的设定为准,如果在启动一个容器时希望使用其Dockerfile中声明的端口,则使用-P
选项:
docker run -P your-docker-image
FROM 指定基础镜像
FROM
指定构建使用的基础镜像,FROM
命令必须写在其他的指令前。
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
LABEL 添加镜像元数据
LABEL
指令添加的元数据需要以键值对的形式指定。
示例:
LABEL version="1.0.0"
LABEL description="This description illustrates \
that label-values can span multi lines."
LABEL key1="v1" k2="v2" k3="v3"
注意:
- 在
LABEL
指令的值中,\
可以用来换行。 - 推荐将所有元数据放到一条
LABEL
中执行 - 可以通过
docker inspect
命令来查看镜像的标签
MAINTAINER 维护者信息
用于为Dockerfile署名。
示例:
MAINTAINER darren<darren@darren_s.com>
RUN 执行命令
RUN
不同于CMD
指令,RUN
可以在Dockerfile中出现和执行多次。
在Shell终端中执行命令,Linux中默认是/bin/sh -c
,Windows中是cmd /s /c
。
格式:
RUN <command>
RUN ["executable", "arg1", "arg2", ..., "argN"]
示例:
RUN ["/bin/sh", "-c", "echo Hello Wolrd!"]
USER 指定启动用户
指定启动时的用户,后续的指令都将以该用户执行命令。
示例:
USER wasuser
使用USER
指令的各种方式
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
如不通过USER
指令指定用户,默认的用户为root
。
可以在docker run
命令中通过-u
选项覆盖该指令的值。
VOLUME 指定挂载点
向容器添加卷,一个卷是可以存在于一个或多个容器内的特定目录。
使容器内的一个目录具有持久化存储的功能,被指定的目录既可以被容器本身使用,也可以共享给其他容器。
- 卷可以在容器之间共享和重用
- 一个容器可以不和别的容器共享卷
- 对卷的修改立即生效
- 对卷的修改不会对更新镜像产生影响
- 卷一直存在到没有容器再使用它
示例:
VOLUME /mnt/data
该指令为每个基于该镜像创建的容器创建一个名为/mnt/data
的挂载点。也可以指定多个卷:
VOLUME ["/mnt/project1", "/mnt/project2"]
WORKDIR 指定工作目录
从镜像创建容器时,在容器内设置一个工作目录。
相当于Linux中的cd
命令,用于切换到指定的工作目录,后续的指令都将在指定的工作目录下执行。
WORKDIR
指令可以多次出现,在不同的工作目录之间进行切换:
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
RUN [ "rackup" ]
启动容器时可以使用-w
选项覆盖工作目录:
docker run -it -w /var/log ubuntu pwd
会将容器内的工作目录设置为/var/log
。
ONBUILD指令
为镜像添加触发器,当镜像A被作为镜像B的基础镜像,在构建镜像B时,会执行镜像A的ONBUILD
指令。
注意:
ONBUILD
指令按照其在镜像A中声明的顺序依次执行ONBUILD
指令只能被继承一次,即如果镜像C再以镜像B作为基础镜像,构建镜像C时不会触发镜像A的ONBUILD
指令。- 可以认为镜像A的
ONBUILD
指令在镜像B的FROM
指令后立即执行。 FROM
、MAINTAINER
、ONBUILD
指令是不能出现在ONBUILD
指令中的。
示例
镜像A中:
ONBUILD ADD . /var/www
镜像B
FROM 镜像A
则会在构建镜像B的Step 0 : FROM
阶段就执行镜像A的ONBUILD
指令,即将构建上下文中的所有内容添加到/var/www
目录
Dockerfile常见命令的更多相关文章
- Docker - Dockerfile - 常见命令简介
概述 感觉是个 比较重要的东西 有个疑问 我是先讲 docker build 还是 先讲 Dockerfile 穿插讲 docker build 最基本的东西 原理 -t -f docker file ...
- 016、Dockerfile 常用命令(2019-01-07 周一)
参考https://www.cnblogs.com/CloudMan6/p/6864000.html Dokcerfile常见命令 FROM 指定base镜像 MAINTAINER ...
- 2 . Linux常见命令
Linux常见命令格式: 命令名称 选项 参数 ls -alh 文件/目录 --all #ls 显示当前目录内容 #ls -l 显示文件详细信息 #ls -hl h已常见单位显示文件大小 k M G# ...
- [Linux基础]Linux基础知识入门及常见命令.
前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1:192.168.40.11Linux ip:192.168 ...
- 嵌入式Linux开发教程:Linux常见命令(上篇)
摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...
- 关于XShell的常见使用和设置以及Linux中的常见命令.
本文部分转自:http://sundful.iteye.com/blog/704079 和 http://www.vckai.com/p/5 有时候在XShell中操作的一些命令傻傻的分不清这个命令到 ...
- 重启IIS常见命令
重启IIS常见命令 http://jingyan.baidu.com/article/4ae03de30d6cfa3efe9e6b4a.html
- 一个linux常见命令的列表
这是一个linux常见命令的列表. 那些有• 标记的条目,你可以直接拷贝到终端上而不需要任何修改,因此你最好开一个终端边读边剪切&拷贝. 所有的命令已在Fedora和Ubuntu下做了测试 命 ...
- shell中bash的常见命令
shell 在计算机科学中,Shell俗称壳,用来区别Kernel(核) Shell分类:1:图形界面shell:通过提供友好的可视化界面,调用相应应用程序,如windows系列操作系统,Linux系 ...
随机推荐
- Tomcat服务器种的HttpServletRequest类
HttpServletRequest 类有什么作用: 每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Reque ...
- Docker部署Mysql实践
前言:由于Docker部署容器时,没有指定IP,当机器重启后,容器的IP会变化,所以在创建容器的时候,最好能固定IP:同时,在Ubuntu系统中,每次执行命令,都需要root权限,命令需要加sudo标 ...
- 北航面向对象OO第三单元——JML
简介 本单元借助JML(Java Modeling Language),训练了我们关于的"规格(specification)"的意识和思想 本单元代码难度较低,简单来讲就是给你规定 ...
- 【AI】PytorchSegmentCode
From: https://liudongdong1.github.io/ 0. 基础配置 0.1. 设置随机种子 def set_seeds(seed, cuda): ""&qu ...
- Raspberry Pi 中安装Mono
摘自:http://www.phodal.com/blog/user-csharp-develop-raspberry-pi-application/ Raspberry Pi C# Mono Lin ...
- 【spring 注解驱动开发】spring对象的生命周期
尚学堂spring 注解驱动开发学习笔记之 - 生命周期 生命周期 1.生命周期-@Bean指定初始化和销毁方法 2.生命周期-InitializingBean和DisposableBean 3.生命 ...
- js之DOM入门(慕课网学习笔记)
DOM简介 获得元素 document.getElementById('') 1.通过id获得元素内容 document.getElementsByTagName('') 2.通过标签获得元素内容 d ...
- Python创建二维列表的正确姿势
Python创建二维列表的正确姿势 简介 Python中没有数组,使用list结构代替,并且list结构的功能更加强大: 支持动态扩容,无需担心元素过量 对list内的元素类型不做一致性约束 提供丰富 ...
- Android WorkManager 定时任务
App有时可能需要定期运行某些工作.例如,可能要定期备份数据.上传信息到服务器,定期获取新的内容等等. 在app运行期间,我们使用Handler也可以完成定期的功能.在这里我们介绍WorkManage ...
- Jmeter HTML 报告、Jenkins 配置
目录 Jmeter 生成 HTML 测试报告 Jenkins 配置 Jmeter 生成 HTML 测试报告 JMeter 支持生成 HTML 测试报告, 以便从测试计划中获得图表和统计信息. 以上定义 ...