如何构建开发和运行docker镜像?

时间:2017-09-20 14:37:48

标签: docker

我有一个C / C ++项目,想要从alpine构建2个图像进行开发并单独运行。

  • 开发者形象:安装所有开发环境,如gcc,cmake,带开发包的库(例如:boost-dev)。

  • 运行映像:在从dev映像成功构建后只包含二进制文件,并且只包含用于运行的普通库包(例如:boost)。

因此,与dev图像相比,运行图像的大小最小。

我可以使用1个Dockerfile来构建这两个图像吗?我用ONBUILD指令进行了一些研究,但没有找到解决方案。

请帮我解决这个问题。

谢谢&的问候,

1 个答案:

答案 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>