skip to Main Content

I am using an alpine 3.11 to build my image, everything goes well during the build the dockefile is here below :

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

this image is later used to lunch some jenkins jobs nothing unusual.

But when i try to use the diff command in of these jobs I have the following error :

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

that’s why i tried to install the coreutils package but still the "-c" option is still unrecognized which is weird.

So my question is there a way to add the -c option for the diff command because in the manual of GNU this should be available automatically but apparently not on Alpine ? if there is a way could anyone please share it.

P.S : In case you are wondering why am I using the diff command it is just to compare two json files and the -c is necessary for me in this context.

2

Answers


  1. Chosen as BEST ANSWER

    Well I just had to add the diffutils package to the list after installing it everything works well


  2. In spite of it being required in the POSIX diff specification it looks like the BusyBox implementation of diff doesn’t support the -c option.

    One thing you could do is change your diff invocation to use unified context diff format. Again, BusyBox diff appears to not support -u, so you need to use an explicit -U option with the number of lines of context

    diff -U3 file.orig file.new
    

    In general, the Alpine environment has many small differences like this. If you’re installing the GNU versions of these tools anyways – your Dockerfile already installs GNU bash and coreutils – you’ll probably find minimal to no space savings from using an Alpine base image, and using a Debian or Ubuntu base that already includes the GNU versions of these tools will be easier.

    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 
          ...
    

    You may need to search on https://packages.debian.org/ to find equivalent Debian packages. build-essential is a metapackage that includes the entire C toolchain (gcc, make, et al.); bash, coreutils, and diffutils would typically be installed as part of the base distribution image.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search