Search code examples
openshiftapache-nifi

Nifi image Not Running over openshift


While trying to run docker image of apache nifi present in the docker hub in the open shift, it is giving me the permission issue as the docker image was running the user nifi which is not allowed via openshft. so I build the docker image using the below docker file but now I am not even able to run the build image in my local docker container.

    FROM openjdk:8-jre

ARG NIFI_VERSION=1.12.1
ARG BASE_URL=https://archive.apache.org/dist
ARG MIRROR_BASE_URL=${MIRROR_BASE_URL:-${BASE_URL}}
ARG NIFI_BINARY_PATH=${NIFI_BINARY_PATH:-/nifi/${NIFI_VERSION}/nifi-${NIFI_VERSION}-bin.zip}
ARG NIFI_TOOLKIT_BINARY_PATH=${NIFI_TOOLKIT_BINARY_PATH:-/nifi/${NIFI_VERSION}/nifi-toolkit-${NIFI_VERSION}-bin.zip}

ENV NIFI_BASE_DIR=/opt/nifi
ENV NIFI_HOME ${NIFI_BASE_DIR}/nifi-current
ENV NIFI_TOOLKIT_HOME ${NIFI_BASE_DIR}/nifi-toolkit-current

ENV NIFI_PID_DIR=${NIFI_HOME}/run
ENV NIFI_LOG_DIR=${NIFI_HOME}/logs

USER root

ADD sh/ ${NIFI_BASE_DIR}/scripts/

# Setup NiFi user and create necessary directories
RUN mkdir -p ${NIFI_BASE_DIR} \
    && apt-get update \
    && apt-get install -y jq xmlstarlet procps

# Download, validate, and expand Apache NiFi Toolkit binary.
RUN curl -fSL ${MIRROR_BASE_URL}/${NIFI_TOOLKIT_BINARY_PATH} -o ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip \
    && echo "$(curl ${BASE_URL}/${NIFI_TOOLKIT_BINARY_PATH}.sha256) *${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip" | sha256sum -c - \
    && unzip ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip -d ${NIFI_BASE_DIR} \
    && rm ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip \
    && mv ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION} ${NIFI_TOOLKIT_HOME} \
    && ln -s ${NIFI_TOOLKIT_HOME} ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION} \
    && chmod -R g+rwX ${NIFI_TOOLKIT_HOME}


# Download, validate, and expand Apache NiFi binary.
RUN curl -fSL ${MIRROR_BASE_URL}/${NIFI_BINARY_PATH} -o ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip \
    && echo "$(curl ${BASE_URL}/${NIFI_BINARY_PATH}.sha256) *${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip" | sha256sum -c - \
    && unzip ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip -d ${NIFI_BASE_DIR} \
    && rm ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip \
    && mv ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION} ${NIFI_HOME} \
    && mkdir -p ${NIFI_HOME}/conf \
    && mkdir -p ${NIFI_HOME}/database_repository \
    && mkdir -p ${NIFI_HOME}/flowfile_repository \
    && mkdir -p ${NIFI_HOME}/content_repository \
    && mkdir -p ${NIFI_HOME}/provenance_repository \
    && mkdir -p ${NIFI_HOME}/state \
    && mkdir -p ${NIFI_LOG_DIR} \
    && ln -s ${NIFI_HOME} ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION} \
    && chgrp -R 0 ${NIFI_BASE_DIR} \
    && chmod -R g+rwX ${NIFI_BASE_DIR} \
    && chmod -R g=u ${NIFI_BASE_DIR}/ \
    && chmod -R g=u /etc/passwd
#ADD bootstrap.conf ${NIFI_HOME}/conf/bootstrap.conf

# Clear nifi-env.sh in favour of configuring all environment variables in the Dockerfile
RUN echo "#!/bin/sh\n" > ${NIFI_HOME}/bin/nifi-env.sh

# Web HTTP(s) & Socket Site-to-Site Ports
EXPOSE 8080 8443 10000

WORKDIR ${NIFI_HOME}

USER 1001

# Apply configuration and start NiFi
#
# We need to use the exec form to avoid running our command in a subshell and omitting signals,
# thus being unable to shut down gracefully:
# https://docs.docker.com/engine/reference/builder/#entrypoint
#
# Also we need to use relative path, because the exec form does not invoke a command shell,
# thus normal shell processing does not happen:
# https://docs.docker.com/engine/reference/builder/#exec-form-entrypoint-example
ENTRYPOINT ["../scripts/start.sh"]

Getting this error while running in the docker container.

replacing target file  /opt/nifi/nifi-current/conf/nifi.properties
replacing target file  /opt/nifi/nifi-current/conf/nifi.properties
replacing target file  /opt/nifi/nifi-current/conf/nifi.properties
replacing target file  /opt/nifi/nifi-current/conf/nifi.properties
replacing target file  /opt/nifi/nifi-current/conf/nifi.properties
/opt/nifi/scripts/toolkit.sh: 18: /opt/nifi/scripts/toolkit.sh: cannot create //.nifi-cli.nifi.properties: Permission denied

This build is for the open shift, as the apache nifi user is not working in openshift and giving permission issue while starting the local docker


Solution

  • So I've passed for the same issue trying to run NIFI on a Openshift, I hope that could help you. The steps used for me was:

    As @JuanD shows, I added the config on openshift:

    securityContext:
            runAsUser: 1000
    

    Further on that I also did:

    RUN chmod -R g+rw ${NIFI_BASE_DIR} \
        && chmod -R g+rwX ${NIFI_BASE_DIR}/scripts \
        && useradd --shell /bin/bash -u ${UID} -g ${GID} -m nifi
    

    Another rearrange that I did was to move the copy files to be executed before this command.

    And in order to avoid any unnecessary issue I also added the uid-entrypoint.sh

    #!/bin/bash
    
    if ! whoami &> /dev/null; then
      if [ -w /etc/passwd ]; then
        echo "${USER_NAME:-nifi}:x:$(id -u):0:${USER_NAME:-nifi} user:${HOME}:/sbin/nologin" >> /etc/passwd
      fi
    fi
    
    exec "$@" 
    

    The entire dockerfile:

    ARG IMAGE_NAME=openjdk
    ARG IMAGE_TAG=8-jre
    
    FROM ${IMAGE_NAME}:${IMAGE_TAG}
    
    ARG MAINTAINER="Apache NiFi <[email protected]>"
    LABEL maintainer="${MAINTAINER}"
    LABEL site="https://nifi.apache.org"
    
    
    ARG UID=1000
    ARG GID=0
    ARG NIFI_VERSION=1.14.0
    ARG BASE_URL=https://archive.apache.org/dist
    ARG MIRROR_BASE_URL=${MIRROR_BASE_URL:-${BASE_URL}}
    ARG NIFI_BINARY_PATH=${NIFI_BINARY_PATH:-/nifi/${NIFI_VERSION}/nifi-${NIFI_VERSION}-bin.zip}
    ARG NIFI_TOOLKIT_BINARY_PATH=${NIFI_TOOLKIT_BINARY_PATH:-/nifi/${NIFI_VERSION}/nifi-toolkit-${NIFI_VERSION}-bin.zip}
    
    ENV NIFI_BASE_DIR=/opt/nifi
    ENV NIFI_HOME ${NIFI_BASE_DIR}/nifi-current
    ENV NIFI_TOOLKIT_HOME ${NIFI_BASE_DIR}/nifi-toolkit-current
    
    ENV NIFI_PID_DIR=${NIFI_HOME}/run
    ENV NIFI_LOG_DIR=${NIFI_HOME}/logs
    
    # Download, validate, and expand Apache NiFi Toolkit binary.
    RUN mkdir -p ${NIFI_BASE_DIR} \
        && apt-get update \
        && apt-get install -y jq xmlstarlet procps \
        && curl -fSL ${MIRROR_BASE_URL}/${NIFI_TOOLKIT_BINARY_PATH} -o ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip \
        && echo "$(curl ${BASE_URL}/${NIFI_TOOLKIT_BINARY_PATH}.sha256) *${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip" | sha256sum -c - \
        && unzip ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip -d ${NIFI_BASE_DIR} \
        && rm ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}-bin.zip \
        && mv ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION} ${NIFI_TOOLKIT_HOME} \
        && ln -s ${NIFI_TOOLKIT_HOME} ${NIFI_BASE_DIR}/nifi-toolkit-${NIFI_VERSION}
    
    # Download, validate, and expand Apache NiFi binary.
    RUN curl -fSL ${MIRROR_BASE_URL}/${NIFI_BINARY_PATH} -o ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip \
        && echo "$(curl ${BASE_URL}/${NIFI_BINARY_PATH}.sha256) *${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip" | sha256sum -c - \
        && unzip ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip -d ${NIFI_BASE_DIR} \
        && rm ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}-bin.zip \
        && mv ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION} ${NIFI_HOME} \
        && mkdir -p ${NIFI_HOME}/conf \
        && mkdir -p ${NIFI_HOME}/database_repository \
        && mkdir -p ${NIFI_HOME}/flowfile_repository \
        && mkdir -p ${NIFI_HOME}/content_repository \
        && mkdir -p ${NIFI_HOME}/provenance_repository \
        && mkdir -p ${NIFI_HOME}/state \
        && mkdir -p ${NIFI_LOG_DIR} \
        && ln -s ${NIFI_HOME} ${NIFI_BASE_DIR}/nifi-${NIFI_VERSION}
    
    COPY scripts/ ${NIFI_BASE_DIR}/scripts/
    
    RUN chmod -R g+rw ${NIFI_BASE_DIR} \
        && chmod -R g+rwX ${NIFI_BASE_DIR}/scripts \
        && useradd --shell /bin/bash -u ${UID} -g ${GID} -m nifi
    
    # Clear nifi-env.sh in favour of configuring all environment variables in the Dockerfile
    RUN echo "#!/bin/sh\n" > $NIFI_HOME/bin/nifi-env.sh
    
    # Web HTTP(s) & Socket Site-to-Site Ports
    EXPOSE 8080 8443 10000 8000
    
    WORKDIR ${NIFI_HOME}
    
    USER ${UID}
    
    ENTRYPOINT [ "../scripts/uid-entrypoint.sh" ]
    
    CMD [ "../scripts/start.sh" ]
    

    I hope that could help.