# syntax=docker/dockerfile:1
- FROM golang:1.20-alpine AS base
+ ARG GO_VERSION=1.20
+ FROM golang:${GO_VERSION}-alpine AS base
WORKDIR /src
COPY . .
RUN go mod download
RUN go build -o /bin/client ./cmd/client
RUN go build -o /bin/server ./cmd/server
ENTRYPOINT [ "/bin/server" ]
文档解析:
此注释是Dockerfile解析器指令。它指定要使用哪个版本的Dockerfile语法。该文件使用dockerfile:1语法,这是最佳实践:它确保您可以访问最新的Docker构建功能
FROM golang:1.20-alpine
FROM指令使用了哪个基础版本
WORKDIR /src
在容器内创建/src工作目录
COPY . .
将生成上下文中的文件复制到容器中的工作目录例如:COPY demo2-0.0.1-SNAPSHOT.jar $app/app.jar
RUN go mod download
执行命令,例如 RUN mkdir -p $app/logs
ENTRYPOINT [ “/bin/server” ]
指定容器启动时要运行的命令。启动服务器进程。
docker build --tag=buildme .
创建一个带有标签buildme的镜像。镜像标记是镜像的名称
--tag=buildme 指定镜像名称repository
Dockerfile指令的顺序很重要。Docker构建由一系列有序的构建指令组成。Dockerfile中的每条指令都大致转换为一个镜像层
运行生成时,生成器会尝试重用早期生成中的层。如果图像的某个层未更改,则构建器会从构建缓存中拾取该层。如果某个图层自上次生成以来发生了更改,则必须重新生成该图层以及随后的所有图层。
上一节中的Dockerfile将所有项目文件复制到容器中(COPY.),然后在下面的步骤中下载应用程序依赖项(RUN go mod download)。如果要更改任何项目文件,则会使COPY层的缓存无效。它还将使后面所有层的缓存无效。
更小的基础镜像:
该图像的大小从150MB变为8.45MB。这是因为生成的图像只包含二进制文件,而不包含其他内容。
清楚缓存
docker builder prune -af
docker build --target=client --progress=plain . 2> log1.txt
–target=server
–target=client
# syntax=docker/dockerfile:1
- FROM golang:1.20-alpine AS base
+ ARG GO_VERSION=1.20
+ FROM golang:${GO_VERSION}-alpine AS base
docker build --build-arg="GO_VERSION=1.19" .
docker build --target=server --build-arg="APP_VERSION=v0.0.1" --tag=buildme-server .
JAVA_VERSION=openjdk:8
APP_VERSION=demo2-0.0.1-SNAPSHOT.jar
docker build --build-arg JAVA_VERSION=openjdk:8 --build-arg APP_VERSION=demo2-0.0.1-SNAPSHOT.jar --tag demo:frist .
docker run -ti --entrypoint /bin/sh demo:frist
我们在示例中使用的alpine基础容器没有bash,所以这是一个灰壳。它具有bash的一些但不是全部功能。
docker exec -ti myapp /bin/sh
ARG JAVA_VERSION=openjdk:8
ARG APP_VERSION=demo2-0.0.1-SNAPSHOT.jar
FROM ${JAVA_VERSION}-jdk-alpine
# 时区问题
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 字体
COPY fonts /usr/share/fonts/simsun.ttc
ENV app=/app
WORKDIR $app
RUN mkdir -p $app/logs
COPY ${APP_VERSION} $app/app.jar
EXPOSE 5050
ENTRYPOINT ["java", "-server", "-Xms512M", "-Xmx512M", "-Djava.security.egd=file:/dev/./urandom", "-Dfile.encoding=UTF-8", "-XX:+HeapDumpOnOutOfMemoryError", "-Dspring.profiles.active=prod", "-jar", "/app/app.jar"]
ENTRYPOINT ["java","${JAVA_OPTS}","-jar","/app/app.jar"]
docker build -t myorg/myapp .
docker run -p 9000:9000 -e JAVA_OPTS=-Dserver.port=9000 myorg/myapp
NS选项
docker build命令的使用格式:
docker build [OPTIONS]
–build-arg,设置构建时的环境变量
–no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
–pull,默认false。设置该选项,总是尝试pull镜像的最新版本
–compress,默认false。设置该选项,将使用gzip压缩构建的上下文
–disable-content-trust,默认true。设置该选项,将对镜像进行验证
–file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
–isolation,默认–isolation=“default”,即Linux命名空间;其他还有process或hyperv
–label,为生成的镜像设置metadata
–squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。
–tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
–network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
–quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success
–force-rm,默认false。设置该选项,总是删除掉中间环节的容器
–rm,默认–rm=true,即整个构建过程成功后删除中间环节的容器
docker build --build-arg JAR_FILE=target/*.jar -t myorg/myapp .