Dockerfile的使用
Dockerfile
是一个文本文档,其中包含了用户自定义镜像组装的打包规则,之后用户使用docker build
指令就可以完成镜像的构建。
Dockerfile格式
Dockerfile
的格式如下:
在Dockerfile
中,指令是不区分大小写的。但是我们通常会以大写来表示指令,这样更容易区分。Dockerfile
中的指令是按顺序执行的。并且开头必须是FROM
指令(当然解析器指令、ARG
指令和注释除外),FROM
指令代表本次打包的镜像以什么镜像为基础。
例如:FROM nginx
就代表我们要以Nginx镜像为基础去构建我们的镜像
常见的基础镜像:
指令 | 意义 |
---|---|
FROM scratch | 不以任何镜像为基础,俗称空镜像 |
FROM alpine | 以alpine Linux镜像为基础 |
FROM ubuntu | 以ubuntu Linux镜像为基础 |
FROM nginx | 以Nginx镜像为基础 |
FROM redis | 以Redis镜像为基础 |
FROM mongo | 以MongoDB镜像为基础 |
FROM mysql | 以Mysql镜像为基础 |
FROM httpd | 以Httpd镜像为基础 |
FROM php | 以PHP镜像为基础 |
FROM tomcat | 以Tomcat镜像为基础 |
FROM node | 以NodeJs环境镜像为基础 |
FROM oraclejdk | 以OracleJDK环境镜像为基础 |
FROM openjdk | 以OpenJDK环境镜像为基础 |
FROM python | 以Python环境镜像为基础 |
FROM ruby | 以Ruby环境镜像为基础 |
FROM golang | 以Go环境镜像为基础 |
FROM eclipse-temurin | 以开源Java运行环境镜像为基础 |
解析器指令介绍
解析器指令会影响后续Dockerfile
中指令的处理方式。解析器指令不会添加到层的构建中,并且不会在构建步骤中显示。
解析器指令以# directive=value
。一个指令只能使用一次。一旦处理了注释、空行或构建器指令,Docker 就不再寻找解析器指令。
它会将任何类似于# directive=value
这样的指令视为注释,并且不会验证它是否可能是解析器指令。因此,所有解析器指令都必须位于Dockerfile
行首。
解析器指令不区分大小写。我们一般是小写的。约定也是在任何解析器指令之后包含一个空行。并且解析器指令不支持换行符。
解析器指令目前只提供了两个syntax
和escape
,这些指令几乎用不上,所以在这里就不在说明使用方法了。需要了解的可以去官网查看
环境变量
环境变量(用ENV
指令声明)可以在Dockerfile
中做到类似于变量的效果。
在Dockerfile
中我们可以通过$variable_name
或${variable_name}
去使用变量。
${variable_name}
还支持一些bash
语法:
${variable:-word}
表示如果variable
已设置,则结果将是该值。如果variable
未设置,则将是word
。${variable:+word}
表示如果variable
设置则值为word
,否则为空字符串。在所有情况下,
word
都可以是任何字符串,包括附加的环境变量。
可以通过在变量之前添加\
来进行转义:\$fooor
、\${foo}
,例如,将分别转换为$foo
和${foo}
。
环境变量可支持以下指令:
- ADD
- COPY
- ENV
- EXPOSE
- FROM
- LABEL
- STOPSIGNAL
- USER
- VOLUME
- WORKDIR
- ONBUILD(与上述支持的指令之一结合使用时)
.dockerignore
文件
与.gitignore
类似,可以排除一些匹配的文件,使其不存在与构建空间内。
指令相关介绍请参考官方介绍
常用示例
当前场景为go服务器部署,此时有两种方案进行镜像生成及运行