我有一个带有以下内容的Dockerfile:
FROM i386/alpine
WORKDIR /tmp/src/mybuild
ADD . /tmp/src/mybuild
FROM travisci/travis-build
我的目标是最终得到一个32位图像,其中包含两个图像中的内容。在运行sudo docker build --rm --tag travis-32 .
之后,将构建“图像”,但是当我运行sudo docker run -it travis-32 /bin/bash
时,我最终进入了bash终端并输入uname -m
得到了x86_64
,这显然是不是我所期望的32位。
我该如何做?
答案 0 :(得分:1)
Dockerfile
有什么问题:
问题中提到的Dokcerfile
是一个多阶段构建文件。每个阶段都以FROM
开始,应该将其中的工件从第一个构建阶段复制到第二个阶段,以期最终获得较小的docker镜像以用于生产。
在提到的Dokcerfile
中:
i386/alpine
图像中:FROM i386/alpine
WORKDIR /tmp/src/mybuild
ADD . /tmp/src/mybuild
FROM travisci/travis-build
因此最终结果是travisci/travis-build
的精确副本。
关于32b,64b问题:
通常情况下,在32b下编译的内容仅在32b下有效,并且要使其在64b下运行,您需要在64b下进行编译(某些语言(例如go,可以在其中定义目标平台)除外)需要注意。
示例:
看看,并注意使用COPY --from=
语句将工件从舞台移到另一个位置:
FROM golang:1.7.3 as builder
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=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
更多信息可以在官方文档中找到:docker multistage-builds
希望这会有所帮助。