【问题标题】:32bit docker image with other images applied to it应用了其他图像的 32 位 docker 图像
【发布时间】:2019-06-24 13:18:45
【问题描述】:

我有一个包含以下内容的 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 位。

我怎样才能做到这一点?

【问题讨论】:

  • 请发完整的Dockerfile,你发的不完整。
  • @Ammar,它并不完整。这就是文件的完整内容。使用sudo docker build --rm --tag my32bit . 运行它,它应该会做一些事情。我基本上是一个 docker 新手,所以请随时指出缺少的内容

标签: docker 32bit-64bit


【解决方案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

希望这会有所帮助。

【讨论】:

  • 感谢您的回答。我最终做的是使用第二个图像生成一个脚本,然后将其复制到第一个图像中。所以现在我正在运行一个 32 位图像,这就是我所需要的。
猜你喜欢
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2014-08-18
  • 2016-09-24
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多