Dockerfile的使用

Dockerfile是一个文本文档,其中包含了用户自定义镜像组装的打包规则,之后用户使用docker build指令就可以完成镜像的构建。

Dockerfile格式

Dockerfile的格式如下:

# 注释
INSTRUCTION arguments

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行首。
解析器指令不区分大小写。我们一般是小写的。约定也是在任何解析器指令之后包含一个空行。并且解析器指令不支持换行符。
解析器指令目前只提供了两个syntaxescape,这些指令几乎用不上,所以在这里就不在说明使用方法了。需要了解的可以去官网查看

环境变量

环境变量(用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服务器部署,此时有两种方案进行镜像生成及运行

直接运行

FROM alpine:latest
WORKDIR /usr/local/bin
# 拷贝编译好的二进制文件
COPY ./main /usr/local/bin/<filename>
# 暴露端口
EXPOSE 8899
# 执行指令
CMD ["/usr/local/bin/<filename>"]

交叉编译运行

# 第一个阶段:编译 Go 程序
FROM golang:alpine AS builder
WORKDIR $GOPATH/src/<project-name>
# 将代码加入到镜像中
ADD . ./
# 设置交叉编译环境
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
ENV GO111MODULE=on
ENV GOPROXY="https://goproxy.io"
# 编译程序
RUN go build -o <filename> .

# 第二个阶段:运行程序
FROM alpine:latest
# 拷贝编译好的二进制文件
COPY --from=builder /go/src/<project-name>/<filename> /usr/local/bin/<filename>
# 暴露端口
EXPOSE 8899
# 执行指令
CMD ["/usr/local/bin/<filename>"]

Dockerfile的使用
https://blog.cikaros.top/doc/fd3c199a.html
作者
Cikaros
发布于
2022年8月18日
许可协议