Dockerfile使用

参考 https://www.cnblogs.com/ccbloom/p/11174186.html

 

 写了个简单的Dockerfile来制作镜像,目录如下

 

 

root@hyn-virtual-machine:/docker/test# cat Dockerfile
###以下为最终验证正确的内容 FROM python LABEL maintainer="DaisyHYN" WORKDIR /test COPY ./123.txt /test RUN pip install pytest EXPOSE 6666 ENV NAME worrld #CMD["print("111")"]

 

过程中碰到的报错不少:

1.CMD指令格式有问题

更正(我这个是拿来玩玩,我就直接注释掉这行了)

CMD

  • Introduction

    • 指定启动容器的默认要运行的程序,也就是PID为1的进程命令,且其运行结束后容器也会终止。如果不指定,默认是bash。

    • CMD指令指定的默认程序会被docker run命令行指定的参数所覆盖。

    • Dockerfile中可以存在多个CMD指令,但仅最后一个生效。因为一个docker容器只能运行一个PID为1的进程。

    • 类似于RUN指令,也可以运行任意命令或程序,但是两者的运行时间点不同

      • RUN指令运行在docker build的过程中,而CMD指令运行在基于新镜像启动容器(docker run)时。
  • Syntax

    • CMD command param1 param2

    • CMD ["executable","param1","param2"]

    • CMD ["param1","param2"]

      • 前两种语法格式同RUN指令。第一种用法对于CMD指令基本没有意义,因为它运行的程序PID不为1。
      • 第三种则需要结合ENTRYPOINT指令使用,CMD指令后面的命令作为ENTRYPOINT指令的默认参数。如果docker run命令行结尾有参数指定,那CMD后面的参数不生效。

2.RUN指令内部有问题

我install拼错了哈哈哈

3.COPY报错

看报错,很清楚了,只能复制Dockerfile本级别及子目录文件,不能复制父目录

COPY

  • Introduction

    • 复制宿主机上的文件到目标镜像中
  • Syntax

    • COPY <src>... <dest>

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

      • <src>:要复制的源文件或者目录,支持通配符
      • <dest>:目标路径,即正创建的镜像的文件系统路径,建议使用绝对路径,否则,COPY指令会以WORKDIR为其起始路径。
      • 如果路径中如果包含空白字符,建议使用第二种格式用引号引起来,否则会被当成两个文件。
  • Rules

    • <src>必须是build上下文中的目录,不能是其父目录中的文件。
    • 如果<src>是目录,则其内部的文件或则子目录会被递归复制,但<src>目录本身不会被复制。
    • 如果指定了多个<src>,或者<src>中使用通配符,则<dest>必须是一个目录,且必须以 / 结尾。
    • 如果<dest>事先不存在,它将会被自动创建,包括其父目录路径。

 

之后运行还挺顺畅

 

镜像制作好了之后,如下

 

加入LABEL内容,build一遍 ,docker build -t test:v1 ./导致镜像名称重复了(剥夺了上一个镜像的)

,再执行一遍,可以看到docker直接使用了cache

 

posted @ 2022-04-26 16:58  huangyn  阅读(223)  评论(0)    收藏  举报