重新创建和扩展 centos6-i386 Docker 基础映像时出现“cp: Command not found”

Posted

技术标签:

【中文标题】重新创建和扩展 centos6-i386 Docker 基础映像时出现“cp: Command not found”【英文标题】:"cp: Command not found" when recreating and extending centos6-i386 Docker base image 【发布时间】:2016-01-24 05:36:03 【问题描述】:

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

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

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

所以,我目前的想法基本上是通过安装 所有 i686 软件包(包括 GCC)在 Docker 容器中伪造 i686 版本的 CentOS。这样,虽然uname -a 会报告主机的 x86_64 架构,但容器中的其他所有内容都应该非常一致。我从the "centos-i386" base image 中汲取了这个想法(和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

怎么了?

【问题讨论】:

【参考方案1】:

因为您的映像是从“从头开始”构建的,而不是从“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 实例将通过 @987654324 正确设置 PATH @。

【讨论】:

以上是关于重新创建和扩展 centos6-i386 Docker 基础映像时出现“cp: Command not found”的主要内容,如果未能解决你的问题,请参考以下文章

WPF DevComponents Dock Control 不会填满屏幕

Mac App SQLDeveloper在应用程序关闭后卡在Dock中,进程被杀死

MacBook和iPhone接力的时候,dock栏一直不出现接力内容,怎么回事儿

从 Dock 中隐藏 Mac 应用程序

Xamarin.Mac:关闭的窗口未重新打开以单击 Dock 中的应用程序图标

USB4Dock,USB4扩展坞方案 介绍