"cp: Command not found" 在创建和扩展 centos 6-i386 Docker 基础映像时

"cp: Command not found" when recreating and extending centos6-i386 Docker base image

我目前正在重建我们的构建服务器,并为我们的各种项目创建一组 Docker 图像,因为每个项目都有相当不同的工具链和库要求。由于 Docker 当前仅在 64 位主机上运行,​​构建服务器将是 x86_64 Fedora 22 机器。

这些图像必须能够构建 historical/tagged 我们项目的发布而无需修改;如果需要,我们可以更改每个项目的构建过程,但仅限于 current trunk 和 future releases.

现在,我的一个构建环境需要重现旧的 i686 构建服务器。为了执行 32 位程序,我可以简单地安装 i686 支持库 (yum install glibc.i686 ncurses-libs.i686),但这并不能帮助我 build 32 位程序,而无需修改 Makefile将 -m32 传递给 GCC ……并且,如上所述,我根本不想更改历史代码库。

所以,我目前的想法是通过安装 所有 i686 软件包,包括 GCC,在 Docker 容器中基本上伪造一个 i686 版本的 CentOS。这样,虽然 uname -a 将报告主机的 x86_64 架构,但容器中的其他所有内容都应该非常一致。我的想法(和 centos6.tar.gz)来自 the "centos-i386" base image,从本质上讲,我正在尝试重现我自己的本地图像。

遗憾的是,进展并不顺利。

这是一个极简的 Dockerfile:

FROM scratch


# Inspiration from https://hub.docker.com/r/toopher/centos-i386/~/dockerfile/
ADD centos6.tar.gz /
RUN echo "i686" > /etc/yum/vars/arch && \
    echo "i386" > /etc/yum/vars/basearch
ENTRYPOINT ["linux32"]

# Base packages
RUN yum update -y && yum -y install epel-release patch sed subversion bzip zip

# AT91SAM9260 ARM compiler
ADD arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 /usr/local/
ENV PATH $PATH:/usr/local/arm-2009q1/bin

# AT91SAM9260 & native cxxtest
ADD cxxtest-3.10.1.tar.gz /staging/
WORKDIR /staging/cxxtest/
RUN cp -r cxxtest /usr/local/arm-2009q1/arm-none-linux-gnueabi/include/
RUN cp -r cxxtest /usr/local/include/
RUN cp cxxtestgen.pl /usr/bin/
RUN ln -s /usr/bin/cxxtestgen.pl /usr/bin/cxxtestgen
WORKDIR /
RUN rm -rf /staging/

在 cxxtest 安装步骤中的第一个“RUN”构建失败:

/bin/sh: cp: command not found
The command '/bin/sh -c cp -r cxxtest /usr/local/arm-2009q1/arm-none-linux-gnueabi/include/' returned a non-zero code: 127

怎么了?

因为您的映像是从 "scratch" 构建的,而不是从 "centos6" 基础映像构建的(与已发布的 "centos6-i686" 映像一样),即使您解压缩了 CentOS 6作为第一步进入文件系统,Bash 在此之前启动,因此您的 shell 上下文没有有意义的 PATH 设置。在“ENTRYPOINT”之后添加以下内容将导致在构建过程期间再次访问所有常用的二进制文件:

ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

从您的镜像创建的容器(如果它已构建;比如说,不尝试构建 cxxtest)将永远不会受到影响,因为新的 Bash 实例会通过 /etc/profile.

正确设置了 PATH