77

I have the below Dockerfile for zookeeper and I am trying to create an image for it, but it is giving me an error. I have recently started working with Docker, and started playing with a Zookeeper setup, so I am not able to understand. What does this error mean?

FROM ubuntu:trusty
MAINTAINER David

RUN apt-get update && apt-get install -y openjdk-7-jre-headless wget
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64

# Install required packages
RUN apk add --no-cache \
    bash \
    su-exec

ENV ZOO_USER=zookeeper \
    ZOO_CONF_DIR=/conf \
    ZOO_DATA_DIR=/data \
    ZOO_DATA_LOG_DIR=/datalog \
    ZOO_PORT=2181 \
    ZOO_TICK_TIME=2000 \
    ZOO_INIT_LIMIT=5 \
    ZOO_SYNC_LIMIT=2

# Add a user and make dirs
RUN set -x \
    && adduser -D "$ZOO_USER" \
    && mkdir -p "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR" \
    && chown "$ZOO_USER:$ZOO_USER" "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR"

ARG GPG_KEY=C823E3E5B12AF29C67F81976F5CECB3CB5E9BD2D
ARG DISTRO_NAME=zookeeper-3.4.9

# Download Apache Zookeeper, verify its PGP signature, untar and clean up
RUN set -x \
    && apk add --no-cache --virtual .build-deps \
        gnupg \
    && wget -q "http://www.apache.org/dist/zookeeper/$DISTRO_NAME/$DISTRO_NAME.tar.gz" \
    && wget -q "http://www.apache.org/dist/zookeeper/$DISTRO_NAME/$DISTRO_NAME.tar.gz.asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-key "$GPG_KEY" \
    && gpg --batch --verify "$DISTRO_NAME.tar.gz.asc" "$DISTRO_NAME.tar.gz" \
    && tar -xzf "$DISTRO_NAME.tar.gz" \
    && mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR" \
    && rm -r "$GNUPGHOME" "$DISTRO_NAME.tar.gz" "$DISTRO_NAME.tar.gz.asc" \
    && apk del .build-deps

WORKDIR $DISTRO_NAME
VOLUME ["$ZOO_DATA_DIR", "$ZOO_DATA_LOG_DIR"]

EXPOSE $ZOO_PORT 2888 3888

ENV PATH=$PATH:/$DISTRO_NAME/bin \
    ZOOCFGDIR=$ZOO_CONF_DIR

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["zkServer.sh", "start-foreground"]

Below is the error I got:

Step 4 : ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
 ---> Running in a49507cb9725
 ---> 77b37883caf4
Removing intermediate container a49507cb9725
Step 5 : RUN apk add --no-cache     bash     su-exec
 ---> Running in a4fd76a644cf
/bin/sh: 1: apk: not found
The command '/bin/sh -c apk add --no-cache     bash     su-exec' returned a non-zero code: 127

Am I doing anything wrong here? Why is apk not found?

Matthew Schuchard
  • 25,172
  • 3
  • 47
  • 67
john
  • 11,311
  • 40
  • 131
  • 251
  • 47
    `apk` is the package manager for Alpine. You're using Ubuntu. You need to use `apt-get`. – larsks Nov 06 '16 at 02:32
  • 3
    [This](https://sookocheff.com/post/docker/containerizing-zookeeper-a-guided-tour/) looks like an article that might be very apropos to what you're trying to do. – larsks Nov 06 '16 at 02:34
  • 1
    @larsks thanks for pointing out the mistake. So you are saying I should replace `apk` with `apt-get` in my Dockerfile and it should work? I want to keep my FROM tag as it is. – john Nov 06 '16 at 03:36
  • I want to use trusty image to make it work. – john Nov 06 '16 at 03:41
  • for Alpine users `RUN apk update` works but `RUN "apk update"` does not... – Ray Foss Mar 11 '21 at 05:22

2 Answers2

76

As larsks mentions, apk is for Alpine distributions and you selected FROM ubuntu:trusty which is Debian based with the apt-get command. Change your FROM line to FROM alpine:3.4 to switch to the Alpine based image with apk support.

valiano
  • 16,433
  • 7
  • 64
  • 79
BMitch
  • 231,797
  • 42
  • 475
  • 450
  • 3
    aahh now I understood. But let's say I want to keep `FROM ubuntu:trusty` line then what I need to change? So I should replace `apk` with `apt-get` everywhere in my Dockerfile to make it work? – john Nov 06 '16 at 03:35
  • 1
    Changing to a different packaging tool that's pointing to it's own repositories means a different syntax and different package names. [larsks's second link](http://stackoverflow.com/questions/40445243/bin-sh-1-apk-not-found-while-creating-docker-image/40445482?noredirect=1#comment68137377_40445243) provides the answer for that. – BMitch Nov 06 '16 at 16:24
  • is it possible to install apk manager on ubuntu? – user732456 Jan 04 '21 at 16:16
  • 1
    @user732456 that would have the same effect as installing Windows 95 and NT on the same C drive. These are different distributions, different (incompatible) libraries, what would happen when one package manager overwrites the files installed by the other? – BMitch Jan 05 '21 at 13:23
  • I can imagine that it's not a brilliant idea, but I needed for testing purposes only. Also once I gave my Mac to our admin for installation and if I recall it right I ended up with apt-get on my computer alongside with brew. So my guess was that although it's not a good practice it's not impossible. – user732456 Jan 05 '21 at 14:29
  • I still get: Step 4/18 : RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers ---> Running in 00068e9429e6 /bin/sh: apk: not found ERROR: Service 'django_app' failed to build : The command '/bin/sh -c apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers' returned a non-zero code: 127 – Дмитро Олександрович Sep 03 '21 at 11:00
16

Quite late to the party. I'll put down what worked for me.

As john rightly pointed out that apk is package manager for alpine distributions, for ubuntu image, we need to use apt-get:

FROM ubuntu:trusty
RUN apt-get update && apt-get install -y tini

Otherwise Alpine base image can be used to run apk commands:

FROM python:3.7-alpine3.12
RUN apk add --no-cache tini
Dharman
  • 30,962
  • 25
  • 85
  • 135
sxddhxrthx
  • 587
  • 5
  • 13