Dockerfile详解

一. 基础命令:

1. FROM:基础镜像

# 注释部分
FROM ubuntu:14.04
MAINTAINER Hollson "hollson@qq.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

2. MAINTAINER:作者信息

MAINTAINER Hollson "hollson@qq.com"

3. RUN:指定镜像构建时的指令

  • shell模式:RUN <command>
  • exec模式:RUN ["executable","param1","param2"]
  • 每一条run指令都会构建一层新镜像
# shell模式
RUN echo hello


# exec模式(可以指定其他形式的shell)
RUN ["/bin/bash","-c","echo hello"]

4. EXPOSR:指定容器端口

  • 可以指定多个端口,如EXPOSE <port> [<port>...],也可以使用多个EXPOSE命令。
  • EXPOSE只是指定了容器会使用的特定端口,但不会自动打开,仍需在运行时添加端口的映射。

5. CMD:指定容器运行时命令

  • shell模式:CMD <command> param1 param2
  • exec模式:CMD ["executable","param1","param2"]
  • 参数模式:CMD ["param1","param2"],作为ENTRYPOINT的默认参数。
  • CMD命令指定了容器运行时的默认行为,会被docker run指定的命令覆盖。

6. ENTRYPOINT:指定容器运行时命令

  • shell模式:ENTRYPOINT <command> param1 param2
  • exec模式:ENTRYPOINT ["executable","param1","param2"]
  • 与CMD命令一致,只是默认不会被docker run 覆盖,强行覆盖用docker run --entrypoint

组合使用案例1:

FROM centos
MAINTAINER allocator
RUN yum install -y nginx
RUN echo 'hello world' > /usr/share/nginx/html/index.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx"]
docker run --name test -p 5000:80 -it test_nginx -g "daemon off"

组合使用案例2:

ENTRYPOINT ["/usr/sbin/nginx"]
# CMD只提供参数
CMD ["-h"]

7. ADD:文件拷贝

  • ADD <src> ...<dest>ADD ["<src>"..."<dest>"]
  • src是本地相对地址或远程URL(一般建议使用CURL等命令获取远程文件),dest指向容器的绝对路径
  • ADD包含类似tar的解压功能,单纯的文件复制,推荐使用COPY命令

8. COPY:文件拷贝

  • COPY <src> ...<dest>COPY ["<src>"..."<dest>"]

9. VOLUME:向容器添加数据卷

10. WORKDIR:设定容器内的工作目录

  • CMD命令和ENTRYPOINT命令都在此目录下执行。
  • WORKDIR使用绝对路径(使用相对路径,工作目录会向下传递)。

11. ENV:设置容器内环境变量

  • ENV <key> <value>
  • ENV <key>=<value> ...

12. USER:指定用户(默认root)

  • 指定用户:USER daemonUSER nginx
  • 指定用户与组的组合:如USER user:group,可以是user,uid,group,gid的任意组合。

13. ONBUILD:触发器

  • ONBUILD [INSTRUCTION],当被作为基础镜像,在子镜像构建时触发执行。

二. 构建镜像

1. 构建过程

从基础镜像运行容器
执行一条命令,对容器作出修改
执行commit,构建一个新的镜像层
基于刚提交的镜像运行一个新容器
再执行下一条命令,反复直至所有命令执行完毕。

2. 构建调试

  • docker build会删除中间层容器,但不会删除中间层镜像。
  • 可以基于中间层镜像执行docker run命令,实现镜像调试。
docker run -it ea15d18dfeb5 /bin/sh    #ea15d18dfeb5是中间层镜像ID

3. 构建缓存

  • Docker的构建会将上一层镜像视为缓存,每一次的构建会看到“Using cache”的标识。
  • 使用docker build --no-cache可设置不使用缓存。
  • 使用ENV REFRESH 2019-01-01, 通过修改刷新时间,跳过缓存
FROM alpine:latest
RUN ...
ENV REFRESH 2019-01-01`        #从这条命令以后,不使用缓存

...

4. 构建历史

docker history <image-id>    #查看完整的镜像构建过程

三. 忽略文件

$ touch .dockerignore
#comment


#代表根目录(上下文环境目录中)中以abc开头的任意直接子目录或者直接子文件将被忽略
#如/abc abc.txt
/abc*


#代表根目录(上下文环境目录中)中任意直接子目录中以abc开头的任意直接子目录或者直接子文件将被忽略
#如 /file/abc /file/abc.txt
*/abc*


#代表根目录(上下文环境目录中)中任意两级目录下以abc开头的任意直接子目录或者直接子文件将被忽略
#如 /file1/file2/abc /file1/file2/abc.txt
*/*/abc*


#排除根目录中的文件和目录,其名称是单字符扩展名temp。例如,/tempa与/tempb被排除在外。
temp? 


#Docker还支持一个**匹配任意数量目录(包括零)的特殊通配符字符串
**/abc*


# 以感叹号表示不忽略
!README.md


#异常规则的放置位置会影响行为
*.md
!README*.md
README-secret.md
#README-secret.md 仍然会被忽略
	
*.md
README-secret.md
!README*.md
#README-secret.md 不会被忽略


您甚至可以使用该.dockerignore文件来排除Dockerfile和.dockerignore文件。这些文件仍然发送到守护程序,因为它需要它们来完成它的工作。但是ADD和COPY命令不会将它们复制到图像中。

# 忽略文件
**/
!/*linux.amd64.prod
!/conf

*.md
!README.md
.dockerignore


参考:
https://blog.csdn.net/Allocator/article/details/70490218

发布了49 篇原创文章 · 获赞 29 · 访问量 4921
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览