k8s一个容器多个镜像_如何使用一个 Dockerfile 文件描述多个镜像

f74a4c59bd24e2eafff5b24d5b57c444.png我们知道在 Docker v17.05 版本后就开始支持多阶段构建 (multistage builds)了,使用多阶段构建我们可以加速我们的镜像构建,在一个 Dockerfile 文件中分不同的阶段来处理镜像。

例如,如下所示的多阶段构建的 Dockerfile 文件:

FROM golang:1.9-alpine as builder

RUN apk --no-cache add git

WORKDIR /go/src/github.com/go/helloworld/

RUN go get -d -v github.com/go-sql-driver/mysql

COPY app.go .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest as prod

RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY --from=0 /go/src/github.com/go/helloworld/app .

CMD ["./app"]

构建镜像

$ docker build -t go/helloworld:3 .

这样构建出来的镜像容量也非常小。

除此之外,Docker 多阶段构建还可以只构建某一阶段的镜像,比如我们一个项目中由于需求可能会最终打包成多个 Docker 镜像,我们当然可以为每一个镜像单独编写一个 Dockerfile,但是这样还是比较麻烦。遇到这种需求我们就可以直接使用多阶段构建来解决。如下所示的 Dockerfile:

#
# BUILD ENVIRONMENT
# -----------------
ARG GO_VERSION
FROM golang:${GO_VERSION} as builder

RUN apt-get -y update && apt-get -y install upx

WORKDIR /workspace
COPY go.mod go.mod
COPY go.sum go.sum
RUN go mod download

# Copy the go source
COPY main.go main.go
COPY api/ api/
COPY controllers/ controllers/
COPY internal/ internal/
COPY webhooks/ webhooks/
COPY version/ version/
COPY cmd/ cmd/

ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
ENV GO111MODULE=on

# Do an initial compilation before setting the version so that there is less to
# re-compile when the version changes
RUN go build -mod=readonly "-ldflags=-s -w" ./...

ARG VERSION

# Compile all the binaries
RUN go build -mod=readonly -o manager main.go
RUN go build -mod=readonly -o proxy cmd/proxy/main.go
RUN go build -mod=readonly -o backup-agent cmd/backup-agent/main.go
RUN go build -mod=readonly -o restore-agent cmd/restore-agent/main.go

RUN upx manager proxy backup-agent restore-agent

#
# IMAGE TARGETS
# -------------
FROM gcr.io/distroless/static:nonroot as controller
WORKDIR /
COPY --from=builder /workspace/manager .
USER nonroot:nonroot
ENTRYPOINT ["/manager"]

FROM gcr.io/distroless/static:nonroot as proxy
WORKDIR /
COPY --from=builder /workspace/proxy .
USER nonroot:nonroot
ENTRYPOINT ["/proxy"]

FROM gcr.io/distroless/static:nonroot as backup-agent
WORKDIR /
COPY --from=builder /workspace/backup-agent .
USER nonroot:nonroot
ENTRYPOINT ["/backup-agent"]

FROM gcr.io/distroless/static as restore-agent
WORKDIR /
COPY --from=builder /workspace/restore-agent .
USER root:root
ENTRYPOINT ["/restore-agent"]

我们可以看到在这一个 Dockerfile 中我们使用多阶段构建定义了很多个 Targets,当我们在构建镜像的时候就可以通过 --target 参数来明确指定要构建的 Targets 即可,比如我们要构建 controller 这个目标镜像,则直接使用下面的命令构建即可:

$ docker build --target controller \
  --build-arg GO_VERSION=${GO_VERSION} \
  --build-arg VERSION=$(VERSION) \
  --tag ${DOCKER_REPO}/${DOCKER_IMAGE_NAME_PREFIX}controller:${DOCKER_TAG} \
  --file Dockerfile .

同样要构建其他的目标镜像则将 target 的参数值替换成阶段定义的值即可。这样我们就用一个 Dockerfile 文件定义了多个镜像。

434bcf8ffa23105943d77675dda46d8a.gif  点击屏末  | 即刻学习 6023af1e655b62ee09cc74060fe8a2df.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes(简称K8s)是一个开源的容器编排平台,用于管理容器化应用程序的部署、扩展和自动化操作。在Kubernetes中,我们可以通过将容器镜像部署到Kubernetes集群中的容器中来运行应用程序。 首先,我们需要创建一个Docker镜像,该镜像包含了我们想要运行的应用程序及其依赖项。Docker镜像可以使用Dockerfile来定义,其中包含了构建这个镜像所需的步骤和命令。常见的构建步骤包括下载所需的软件包、设置环境变量、复制应用程序代码等。通过运行`docker build`命令,我们可以构建出一个可用的Docker镜像。 接下来,我们需要将这个Docker镜像上传到一个镜像仓库中,这样Kubernetes集群就可以拿到这个镜像运行。常见的镜像仓库有Docker Hub、Google Container Registry等。我们可以使用`docker push`命令将镜像推送到镜像仓库中,并确保设置了适当的访问控制。 然后,在Kubernetes集群中创建一个容器部署。容器部署是一个由Kubernetes管理的逻辑单元,用于定义如何在集群中运行一个多个同样的容器实例。我们可以使用Kubernetes配置文件(通常是YAML格式)来定义容器部署。在配置文件中,我们需要指定容器部署所使用镜像容器的资源要求和限制、容器之间的网络和存储配置等信息。 最后,我们可以使用Kubernetes命令行工具(如kubectl)来创建和管理容器部署。通过运行`kubectl apply -f`命令,我们可以将容器部署配置文件应用到Kubernetes集群中。Kubernetes会根据配置文件中的定义,自动创建容器实例,并在集群的节点上运行这些容器。 总体而言,将Docker镜像运行到Kubernetes容器中需要完成以下步骤:构建Docker镜像、上传到镜像仓库、创建容器部署配置文件、应用配置到Kubernetes集群。通过这些步骤,我们可以在Kubernetes集群中轻松地部署和管理容器化应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值