Dockerfile指令
- ** CMD **
用于指定一个容器启动时要运行的命令。
CMD["/bin/bash","-l"]
Docker 推荐使用数组的语法设置要执行的命令。在Dockerfile中只能指定一条CMD命令.如果指定了多条,也只有最后一条被使用。
docker run命令可以覆盖CMD指令。
- ENTRYPOINT
这个指令与CMD指令类似,但是这个指令不会轻易被docker run覆盖。因此可以将这两个命令组合起来使用。
见如下:
在原来基础上加了这两条命令
如果启动时,不指定命令,nginx则默认使用 -h方式启动 (用来显示Nginx的帮助信息)
如果指定了,则使用指定命令
docker run -d -p 80 keithfu/static_web -g "daemon off;"
如果确实需要,可以通过--entrypoint标志覆盖ENTRYPOINT指令
-
WORKDIR
该指令用来从镜像创建一个新容器时,在容器内设置一个工作目录。ENTRYPOINT和CMD命令指定的程序会在这个目录下执行
WORKDIR /opt/webapp/db
RUN bundle install
wORKDIR /opt/webapp
ENTRYPOINT ["rackup"]
可以使用 -w标识在运行时覆盖工作目录
docker run -ti -w /var/log ubuntu pwd
- ENV
用来设置环境变量,可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样
我们可以在其它命令中直接使用这些环境变量
ENV TARGET_DIR=/opt/app
WORKDIR $TARGET_DIR
- USER
基于该镜像启动的容器会以nginx 用户的身份来运行。我们可以指定用户名或UID以及组或GID,也可是两者的组合。
USER user
USER user:group
USER uid
USER uid:gid
USER uid:group
...
可以通过-u选项来覆盖
- VOLUME
用来基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化功能。- 卷可以在容器间共享和重用。
- 一个容器可以不是必须和其它容器共享卷
- 对卷的修性是立时生效的
- 对卷的修性不会对镜像产生影响
- 卷会一直存在直到没有任何容器再使用它。
卷的功能让我们可以将数据(如源代码)、数据库或者其它内容添加到镜像中而不是将这些内容提交到镜像中,并且允许我们在多个容器间共享这些内容。
我们可以通过数组的方式指定多个卷。(后续介绍)
- ADD
该指令用来将构建环境下的文件和目录复制到镜像中。需要指定源文件位置和目的文件位置两个参数
ADD software.lic /opt/application/software.lic
在ADD文件时,Docker通过目的地址参数末尾的字符来判断文件源 目录还是文件。以/结尾就是目录,不以/结尾则认为是文件
文件源源也可以是URL
ADD http://a.com/latest.zip /root/wp.zip
如果ADD在处理本地归档文件时(tar archive,gzip,bzip2,xz),Docker 会自动针归档文件解开
ADD latest.tar.gz /var/www/wordpress/
如果目的位置存在了同名的文件或者目录,那们不会被覆盖。
ADD指令使用构建缓存变得无效。该指令后续的指令都不能继续使用之前的构建缓存。
COPY
类似于ADD COPY只关心构建上下文复本地文件,而不会关心提取和解压的工作,且文件必须是与当前构建环境相对的文件或目录,要Dockerfile同一个目录下ONBUILD
该指令能为镜像添加触发器(trigger)。当一个镜像被用作其镜像的基础镜像时,会被执行。触发器可以是任何构建指令
ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make
ONBUILD 会按照你镜像中指定的顺序执行,并且只能被继承一次(也就是只能在子镜像中执行,而不会在孙子镜像中执行)
删除镜像
使用docker rmi 命令