重新创build和扩展centos6-i386 Docker基础镜像时,find“cp:Command not found”

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

这些图片必须能够修改我们项目的历史/标签发布; 我们可以根据需要对每个项目的构build过程进行更改,但仅限于当前中继和将来的发行版。

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

所以,我目前的想法是通过安装包括GCC在内的所有 i686软件包,在Docker容器中基本上伪造一个i686版本的CentOS。 这样,尽pipeuname -a会报告主机的x86_64体系结构,但容器内的其他所有内容都应该保持一致。 我从“centos-i386”基本图像中获得了这个想法(和centos6.tar.gz ),实际上,我正在试图为我自己的本地图像进行复制。

可悲的是,这不太好。

这是一个最小化的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”映像的情况下)构build的,即使您将CentOS 6作为第一步解压到文件系统中,Bash之前启动了,所以你的shell上下文没有有意义的PATH集。 在“ ENTRYPOINT ”之后添加以下内容将导致在构build过程中再次访问所有通常的二进制文件:

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

从图像创build的容器(有它构build;说,不要试图构buildcxxtest )将永远不会受到影响,因为新的Bash实例将通过/etc/profile正确设置PATH。