Linux &引用;cp:未找到命令";在重新创建和扩展centos6-i386 Docker基本映像时

Linux &引用;cp:未找到命令";在重新创建和扩展centos6-i386 Docker基本映像时,linux,gcc,docker,centos6,Linux,Gcc,Docker,Centos6,我目前正在重建我们的构建服务器,并为我们的各种项目创建一组Docker映像,因为每个项目都有相当不同的工具链和库要求。由于Docker目前仅在64位主机上运行,因此构建服务器将是x86_64 Fedora 22机器 这些图像必须能够构建项目的历史/标记版本,无需修改;如果需要,我们可以对每个项目的构建过程进行更改,但仅限于当前主干和未来版本 现在,我的一个构建环境需要复制旧的i686构建服务器。对于执行32位程序,我可以简单地安装i686支持库(yum install glibc.i686 nc

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

这些图像必须能够构建项目的历史/标记版本,无需修改;如果需要,我们可以对每个项目的构建过程进行更改,但仅限于当前主干和未来版本

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

因此,我目前的想法是通过安装所有i686包(包括GCC),在Docker容器中基本上伪造CentOS的i686版本。这样,尽管
uname-a
将报告主机的x86_64体系结构,但容器中的所有其他内容都应该非常一致。我接受了这个想法(和
centos6.tar.gz
),从本质上说,我试图为自己的本地形象复制

可悲的是,事情进展得不太顺利

下面是一个最小的ish
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安装步骤中的第一次“
运行”
”时,生成失败:

/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

怎么了?

因为您的映像是从“零开始”构建的,而不是从“centos6”基础映像构建的(与已发布的“centos6-i686”映像一样),即使您第一步将CentOS 6解包到文件系统中,Bash也是在这之前启动的,因此您的shell上下文没有设置有意义的
路径。在“
入口点
”之后添加以下内容将导致在构建过程中再次访问所有常用的二进制文件:

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

从映像创建的容器(如果它已构建;比如,不尝试构建cxxtest)将永远不会受到影响,因为新的Bash实例将通过
/etc/profile
正确设置路径,因为您的映像是从“零开始”构建的,而不是从“centos6”基础映像(与已发布的“centos6-i686”图像),即使您第一步将CentOS 6解压到文件系统中,Bash在此之前启动,因此您的shell上下文没有有意义的
路径集。在“
入口点
后添加以下内容“将导致在构建过程中,所有常用的二进制文件都可以再次访问:

ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
从您的映像创建的容器(如果它已构建;比如,不尝试构建cxxtest)永远不会受到影响,因为新的Bash实例将通过
/etc/profile
正确设置路径