Alpine 3.11 diff: unrecognized option: c BusyBox v1.31.1 () 多调用二进制

Alpine 3.11 diff: unrecognized option: c BusyBox v1.31.1 () multi-call binary

我正在使用 alpine 3.11 构建我的图像,在构建过程中一切顺利,dokefile 如下:

FROM alpine:3.11
LABEL version="1.0"
ARG UID="110"

ARG PYTHON_VERSION="3.8.10-r0"
ARG ANSIBLE_VERSION="5.0.1"
ARG AWSCLI_VERSION="1.22.56"
  
  # Create jenkins user with sudo privileges
RUN adduser -u ${UID} -D -h /home/jenkins/ jenkins
RUN echo 'jenkins ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
RUN mkdir -p /tmp/.ansible
RUN chown -R jenkins:jenkins /tmp/.ansible
  
  # Install minimal packages
RUN apk --update --no-cache add bash bind-tools curl gcc git libffi-dev libpq make mysql-client openssl postgresql-client sudo unzip wget coreutils
  #RUN apk --update --no-cache add py-mysqldb
RUN apk --update --no-cache add python3=${PYTHON_VERSION} python3-dev py3-pip py3-cryptography
  
  # Install JQ from sources
RUN wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
RUN mv jq-linux64 /usr/bin/jq
RUN chmod +x /usr/bin/jq
  # Install ansible and awscli with python package manager
RUN pip3 install --upgrade pip
RUN pip3 install yq --ignore-installed PyYAML
RUN pip3 install ansible==${ANSIBLE_VERSION}
RUN pip3 install awscli==${AWSCLI_VERSION} boto boto3 botocore s3cmd pywinrm pymysql 'python-dateutil<2.8.1'
  # Clean cache
RUN rm -rf /var/cache/apk/*
  # Display packages versions
RUN python3 --version && \
pip3 --version && \
ansible --version && \
aws --version

这张图片后来被用于一些 jenkins 工作的午餐,没什么特别的。

但是当我尝试在这些作业中使用 diff 命令时出现以下错误:

diff: unrecognized option: c  BusyBox v1.31.1 () multi-call binary

这就是为什么我尝试安装 coreutils 包,但仍然无法识别“-c”选项,这很奇怪。

所以我的问题是有没有办法为 diff 命令添加 -c 选项,因为在 GNU 手册中这应该是自动可用的,但显然不是在 Alpine 上?谁有办法分享一下。

P.S :如果您想知道我为什么要使用 diff 命令,它只是比较两个 json 文件,在这种情况下 -c 对我来说是必需的。

好吧,我只需要在安装后将 diffutils 包添加到列表中,一切正常

尽管 POSIX diff specification it looks like the BusyBox implementation of diff 需要它,但不支持 -c 选项。

您可以做的一件事是更改 diff 调用以使用统一的上下文差异格式。同样,BusyBox diff 似乎不支持 -u,因此您需要使用显式 -U 选项和上下文行数

diff -U3 file.orig file.new

总的来说,Alpine 环境有很多这样的小差异。无论如何,如果您要安装这些工具的 GNU 版本——您的 Dockerfile 已经安装了 GNU bashcoreutils – 您可能会发现使用 Alpine 基础映像节省的费用很少甚至没有 space ,并且使用已经包含这些工具的 GNU 版本的 Debian 或 Ubuntu 基础会更容易。

FROM ubuntu:20.04 # not Alpine
...
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      bind9-utils \
      build-essential \
      curl \
      git-core \
      ...

您可能需要在 https://packages.debian.org/ 上搜索以找到等效的 Debian 软件包。 build-essential 是一个包含整个 C 工具链的元数据包(gccmake); bashcoreutilsdiffutils 通常会作为基本分发映像的一部分安装。