Docker está muy caliente, si no entiende Dockerfile, está FUERA ~

♥ Prólogo

Prólogo: Docker ha sido muy popular en los últimos años. Si quieres jugar bien a Docker, no puedes evitar el Dockerfile. Esto es lo mismo que si quieres jugar bien un servidor Linux y no puedes evitar el caparazón. Hoy hablaremos sobre cómo escribir Dockerfile y qué significan esas instrucciones.

Primero, veamos un Dockerfile simple

#这个Dockerfile作用是打一个python3项目环境
FROM python:3-alpine
WORKDIR /app
ADD . /app
RUN pip3 install -r requirements.txt -i https://pypi.douban.com/simple
CMD ["python3", "main.py"]


#这个Dockerfile作用Dockerfile部署django项目
FROM centos:7
MAINTAINER haili
ADD requeriments.txt /home
WORKDIR /home
RUN yum update && yum -y install mysql && yum -y install python3-pip && pip3 install -r requirements.txt 
ADD autoTest /home/
WORKDIR /home/autoTest
EXPOSE 8000
ENTRYPOINT uwsgi --ini uwsgi.ini

Si desea aprender pruebas automatizadas, aquí le recomiendo una serie de videos. Se puede decir que este video es el primer tutorial de prueba de automatización de interfaz en toda la red en la estación B. Al mismo tiempo, la cantidad de usuarios en línea ha aumentado. llegó a 1,000, y hay notas para coleccionar y varios intercambios técnicos de Lu Dashen: 798478386      

[Actualizado] La colección más detallada de tutoriales prácticos para pruebas automatizadas de interfaces de Python impartidas por la estación B (la última versión de combate real)_哔哩哔哩_bilibili [Actualizado] La colección más detallada de tutoriales prácticos para pruebas automatizadas de Python interfaces impartidas por la estación B (combate real) La última versión) tiene un total de 200 videos, que incluyen: 1. [Automatización de interfaz] La situación actual del mercado de pruebas de software y los estándares de capacidad de los evaluadores. , 2. [Automatización de interfaz] Totalmente capacitado en la biblioteca de solicitudes y la lógica de llamada de método subyacente, 3. [Automatización de interfaz] combate de automatización de interfaz y la aplicación de expresiones regulares y extractores JsonPath, etc. Para videos más emocionantes, preste atención a la cuenta UP. https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337&vd_source=488d25e59e6c5b111f7a1a1a16ecbe9a 

2. Reglas de escritura de Dockerfile

  1. Las instrucciones no distinguen entre mayúsculas y minúsculas, para distinguir el hábito de usar mayúsculas

  2. La primera línea de una línea sin comentarios de Dockerfile debe ser FROM

  3. El nombre del archivo debe ser Dockerfile

  4. Dockerfile especifica un directorio dedicado como espacio de trabajo

  5. Todos los archivos que importan asignaciones deben estar en este directorio de espacio de trabajo

  6. Admite archivos ocultos (.dockeringore) en el directorio del espacio de trabajo de Dockerfile

  7. (.dockeringore) se usa para almacenar archivos que no necesitan ser empaquetados e importados a la imagen, y el directorio raíz es el directorio del espacio de trabajo

  8. Cada instrucción generará una capa de espejo. Si hay más capas de espejo, la eficiencia de ejecución será más lenta. Si se puede escribir como uno específico, se escribirá como uno.

3. Explicación detallada de las instrucciones de Dockerfile
1. DESDE: imagen base
 1.1、FROM是Dockerfile文件开篇第一个非注释行代码
 1.2、用于为镜像文件构建过程指定基础镜像,后续的指令都基于该基础镜像环境运行
 1.3、基础镜像可以是任何一个镜像文件
 1.4、docker build 会在docker宿主机上查找指定的文件,如未找到会自动去Docker Hub Registry上拉取
 1.5、如果没找到对应的镜像就会返回错误信息
2. MANTENEDOR: información del autor del espejo
2.1、废弃了,使用LABLE替代

3.LABLE: información de descripción de la imagen

3.1、LABLE author="haili"

4. COPIAR: copiar archivos del host Docker al nuevo archivo de imagen creado

4.1、COPY <src> <dest>
4.2、COPY ["<src>",.... "<dest>"]
4.3、<src>:要复制的源文件或目录,支持使用通配符
     1、<src>必须是build上下文中的路径,不能是其父目录路径
     2、如果<src>是目录,则其内部文件和子目录都会被递归复制,但是<src>目录本身不会被复制
     3、如果指定了多个<src>,或者<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
4.4、<dest>:目标路径,即正在创建的images的文件系统路径
     1、建议使用绝对路径,否则COPY指定以WORKDIR为其实路径
     2、如果<dest>不存在,将会被自动创建,包括其父目录路径一起创建
4.5、复制文件
     COPY testFile /mnt
4.6、复制目录
     COPY testDir /mnt/testDir
     1、testDir下所有文件和目录都会被递归复制
     2、目标路径要写testDir,否则会复制到/mnt下
5. AÑADIR: similar al comando COPIAR, AÑADIR admite archivos tar y rutas URL
5.1、ADD <src> <dest>
5.2、ADD ["<src>",.... "<dest>"]
5.3、如果<src>为URL切<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<fimename>,如果<dest>以/结尾,则文件名URL指定的文件将被下载并保存为<dest>/fimename
5.4、如果<src>是一个压缩文件(tar),会被解压为一个目录,但是通过URL下载的tar文件不会被解压
5.5、如果是多个<src>,或者是同一个<src>使用了通配符,则<dest>必须是以/结尾的目录,如果<dest>不以/结尾,则<src>会被作为一个普通文件,<src>内容讲被写入到<dest>

6. WORKDIR: se usa para especificar y establecer el directorio de trabajo para EJECUTAR, CMD, PUNTO DE ENTRADA, COPIAR, AÑADIR en el Dockerfile

6.1、WORKDIR /mnt,如果目录不存在会自动创建,包括他的父目录
6.2、一个Dockerfile中WORKDIR可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR路径
6.3、WORKDIR也可以调用ENV指定的变量
6.4:举例
     from python:latest
     workdir /mnt
     run touch a.txt
     workdir /usr
     run touch b.txt

7. VOLUMEN: volumen de datos, utilizado para crear un directorio de punto de montaje en la imagen para montar volúmenes en el host Docker o volúmenes en otros contenedores

7.1、VOLUM mount_point
7.2、VOLUM ["mount_point1","mount_point2"]
7.3、如果挂载点目录下有文件存在,docker run命令会在卷挂载完成后将所有文件复制到容器中
8. EXPONER: abre el puerto de escucha especificado para que el contenedor se comunique con el mundo exterior
8.1、EXPOSE <port> </portocol>
     1、<port>:端口号
     2、</portocol>:协议类型,默认为TCP协议
     EXPOSE 8080/tcp 8081/udp
8.2、不会直接对外暴露这里的端口,只有在run的时候加上-P(大写)才会将EXPOSE的端口暴露出去

9. ENV: se usa para definir las variables de entorno requeridas para la imagen, que pueden ser llamadas por otros comandos en Dockerfile (ENV, ADD, COPY, RUN, CMD)

9.1、ENV key value
     1、key之后的所有内容都会被视为value,因此,一次只能设置一个变量 
9.2、ENV key=value
     1、可以设置多个变量,每个key=value键值对为一个变量
     2、如果value中包含空格需要用反斜杠转义,也可以对value加引号进行标识,反斜杠也可以用于续行
9.3、调用格式:$variable_name 或 ${variable_name}
9.4、定义多个变量建议使用第二种方式,以便在同一层中完成
9.5、举例
     ENV DOC_DIR=/mnt/doc
     COPY index.html ${DOC_DIR:-/mnt/doc} 
     #-:如果DOC_DIR不存在则使用-后面的默认值
     #+:如果DOC_DIR存在则使用+后面的值

10. EJECUTAR: el comando de shell que debe ejecutarse al crear la imagen de compilación de la ventana acoplable se ejecuta de forma predeterminada "/bin/sh -c"

10.1、docker build过程中需要执行的命令
10.2、RUN是在镜像构建完成之后运行结束
10.3、RUN执行的命令只能基于基础镜像的命令,执行之前先要确定基础镜像是否有该命令
10.4、一个Dockerfile可以写多个RUN
    语法一、RUN command1 && command2....  
          1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程
          2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到
          3、RUN echo "test_demo" > a.txt 此时可以使用shell特性
    语法二、RUN ["executable","param1","param2"]
          1、executable为要运行的命令
          2、param1为命令运行的参数
          3、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)
          4、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程
             RUN ["/bin/bash","-c","executable","param1"]
          5、list中的参数要使用双引号
11. CMD: Inicie el contenedor para especificar el programa o comando que se ejecutará de forma predeterminada y ejecute de forma predeterminada "/bin/sh -c"
11.1、docker run过程中需要执行的命令
11.2、CMD运行结束后容器就将终止
11.3、CMD指定的命令将可以被 docker run 最后面的命令覆盖
11.4、一个Dockerfile写多个CMD只有最后一个CMD会生效
    语法一、CMD command
           1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程,能使用shell操作符
           2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到
           3、CMD /bin/httpd -f -h ${httpd}
              此时在运行容器的时候加-it参数无法进入交互式模式,需要使用docker exec进入交互模式
    语法二、CMD ["executable","param1","param2"]
           1、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)
           2、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程
              CMD ["/bin/bash","-c","executable","param1","param2"](有问题,不能启动容器)
    语法三、CMD ["param1","param2"]
           1、需要结合ENTRYPOINT指令提供默认参数使用
12. PUNTO DE ENTRADA: la función de la instrucción de tipo CMD, que se utiliza para especificar el programa o comando de ejecución predeterminado para el contenedor
1、与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序
2、docker run命令的 --entrypoint选项参数可以覆盖ENTRYPOINT指令指定的程序
3、一个Dockerfile中可以有多个ENTRYPOINT,但是只有最后一个会生效
4、ENTRYPOINT主要用于shell作为启动其他进程的父进程,后面跟的参数被当成子进程来启动
    语法一:ENTRYPOINT command
    语法二:ENTRYPOINT  ["/bin/bash","param1","param2"]

13.CMD y ENTRYPOINT existen en Dockerfile al mismo tiempo

1、CMD的值会当做参数传递给ENTRYPOINT
2、实现使用shell子进程启动httpd
3、如果docker run再传入参数,是传给ENTRYPOINT的,因为ENTRYPOINT有自己的参数,此时CMD参数会被ducker run后面跟的参数覆盖,并不是覆盖ENTRYPOINT的参数,要覆盖ENTRYPOINT的参数需要使用--entrypoint选项
    CMD ["/bin/httpd/","-f"]
    ENTRYPOINT /bin/bash -c -h
    通过传参启动容器
    FROM python:latest
    LABLE auth="haili"
    ENV NGX_DOC_ROOT='/data/web/html'
    ADD entrypoint.sh /bin/
    CMD ['/usr/sbin/nginx','-g','daemon off;']
    ENTRYPOINT ['/bin/sh','-c','/bin/entrypoint.sh']
    1、先执行ENTRYPOINT,然后讲CMD的值当做参数传给ENTRYPOINT进行执行

14.USUARIO: especifique el usuario del programa especificado por cualquier instrucción EJECUTAR, CMD y PUNTO DE ENTRADA en el Dockerfile al ejecutar la imagen

1、使用用户名或者UID
2、默认情况下container的运行身份为root用户
3、USER UID | user_name
4、UID 和 user_name必须存在/etc/passwd当中,否则会报错

15.CHEQUEO DE SALUD: chequeo de salud, defina un comando para verificar si el estado de funcionamiento del proceso principal es saludable

15.1、HEALTHCHECK参数
    1、--interval=DURATION(default 30s) 健康检查间隔时间
    2、--timeout=DURATION(default 30s) 超时时间
    3、--start-period=DURATION(default 0s) 容器启动多久后执行健康检查
    4、--retries=N(default 30s) 检测次数
15.2、检查结果
    0:成功
    1:失败
    2:预留字段

15.3、举例
     HEALTHCHECK --interval=5m --timeout=5s CMD curl -f http://localhost:8080 ||exit1
16.SHELL: especifique el programa shell para ejecutar RUN, CMD, ENTRYPOINT
17.OPSIGNAL: Enviar una señal al proceso principal
18. ARG: Parámetros en el proceso de construcción de la ventana acoplable
 18.1、定义pyton镜像作者,通过参数传入
    FROM python
    ARG author="latest"
    LABLE author="${author}"
    18.2、使用
    docker build --build-arg author="haili"
    18.3、常用在docker build 过程中替换参数

19.ONBUILD: se usa para definir un disparador en el Dockerfile

19.1、Dockerfile1中加一个ONBUILD add file,当docker build -t=testpython Dockerfile1的时候ONBUILD指令不会被执行,Dockerfile2中FROM testpython(Dockerfile1构建后生成的镜像),当运行docker build -t=test Dockerfile2的时候Dockerfile1中的ONBUILD add file会被执行
19.2、Dockerfile用于build镜像文件,此镜像文件可以作为base image被另外一个Dockerfile作为FROM参数使用,并以之构建新的镜像文件
19.3、在后面这个Dockerfile中的FROM指令在build过程中被执行时,将触发创建其base image的Dockerfile中ONBUILD指定定义的触发器
19.4、尽管任何指令都可以注册为触发器指令,但是ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令
19.5、使用包含ONBUILD指令的Dockerfile构建镜像应该使用特殊标签如,python:1.0-onbuild
19.6、ONBUILD指令中使用ADD COPY指令要格外小心,因为新构建过程山下文缺少指定的源文件就会

Supongo que te gusta

Origin blog.csdn.net/caixiangting/article/details/132233927
Recomendado
Clasificación