我有一个C / C ++项目,想要从alpine构建2个图像进行开发并单独运行。
开发者形象:安装所有开发环境,如gcc,cmake,带开发包的库(例如:boost-dev)。
运行映像:在从dev映像成功构建后只包含二进制文件,并且只包含用于运行的普通库包(例如:boost)。
因此,与dev图像相比,运行图像的大小最小。
我可以使用1个Dockerfile来构建这两个图像吗?我用ONBUILD指令进行了一些研究,但没有找到解决方案。
请帮我解决这个问题。
谢谢&的问候,
映
答案 0 :(得分:0)
过去需要两个Docker镜像,但最近版本的Docker支持multi-stage builds。这样您就可以通过一个Dockerfile
来实现目标。
您可以阅读链接的文档了解详情,但我们的想法是,您的Dockerfile
分为多个阶段,每个阶段都以新的FROM
行开头。只有最后一个阶段用于生成最终输出图像,它可以通过索引从其他阶段访问文件系统。文档中的示例:
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
这里,第一阶段构建一个Go应用程序,而第二阶段使用已编译的可执行文件构建一个图像,它使用--from=0
参数从第一阶段复制到COPY
指令。 / p>