2016-11-07 4 views
6

ich unter Dockerfile für zookeeper Setup haben, und ich habe für das Docker Bild gebautungültigen Header-Feld Wert „OCI-Laufzeitfehler während Docker Bild läuft

FROM openjdk:8-jre-alpine 

# 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"] 

Ich baue es wie folgt aus:

[email protected]:/home/david/zookeeper-docker# docker build -t david/zookeeper:3.4.9 . 

Wenn ich die zookeeper Instanz laufen, erhalte ich diese Fehlermeldung:

[email protected]:/home/david/zookeeper-docker# docker run --name zookeeper --restart always -d david/zookeeper:3.4.9 
24a282f2d04f1b638820a63a2037f618621d315d8c1cdb62aed609426bb19045 
docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"/docker-entrypoint.sh\\\": permission denied\"\n". 

Was ist hier falsch ich habe alle meine Dateien, die ich? nside zookeeper-docker Verzeichnis. Auch ich gab chmod +x persmission auf docker-entrypoint.sh in meinem aktuellen Verzeichnis.

Im Folgenden ist der Inhalt der docker-entrypoint.sh

#!/bin/bash 

set -e 

# Allow the container to be started with `--user` 
if [ "$1" = 'zkServer.sh' -a "$(id -u)" = '0' ]; then 
    chown -R "$ZOO_USER" "$ZOO_DATA_DIR" "$ZOO_DATA_LOG_DIR" 
    exec su-exec "$ZOO_USER" "$0" "[email protected]" 
fi 

# Generate the config only if it doesn't exist 
if [ ! -f "$ZOO_CONF_DIR/zoo.cfg" ]; then 
    CONFIG="$ZOO_CONF_DIR/zoo.cfg" 

    echo "clientPort=$ZOO_PORT" >> "$CONFIG" 
    echo "dataDir=$ZOO_DATA_DIR" >> "$CONFIG" 
    echo "dataLogDir=$ZOO_DATA_LOG_DIR" >> "$CONFIG" 

    echo "tickTime=$ZOO_TICK_TIME" >> "$CONFIG" 
    echo "initLimit=$ZOO_INIT_LIMIT" >> "$CONFIG" 
    echo "syncLimit=$ZOO_SYNC_LIMIT" >> "$CONFIG" 

    for server in $ZOO_SERVERS; do 
     echo "$server" >> "$CONFIG" 
    done 
fi 

# Write myid only if it doesn't exist 
if [ ! -f "$ZOO_DATA_DIR/myid" ]; then 
    echo "${ZOO_MY_ID:-1}" > "$ZOO_DATA_DIR/myid" 
fi 

exec "[email protected]" 

Im Folgenden wird die Ausgabe:

[email protected]:/home/david/zookeeper-docker# docker run --name zookeeper --entrypoint "/usr/bin/env" david/zookeeper:3.4.9 -- ls -al/
total 80 
drwxr-xr-x 47 root  root   4096 Nov 7 19:09 . 
drwxr-xr-x 47 root  root   4096 Nov 7 19:09 .. 
-rwxr-xr-x 1 root  root    0 Nov 7 19:09 .dockerenv 
drwxr-xr-x 2 root  root   4096 Nov 7 17:44 bin 
drwxr-xr-x 2 zookeepe zookeepe  4096 Nov 7 17:45 conf 
drwxr-xr-x 2 zookeepe zookeepe  4096 Nov 7 19:09 data 
drwxr-xr-x 2 zookeepe zookeepe  4096 Nov 7 19:09 datalog 
drwxr-xr-x 5 root  root   360 Nov 7 19:09 dev 
-rw-r--r-- 1 root  root   873 Nov 6 01:36 docker-entrypoint.sh 
drwxr-xr-x 22 root  root   4096 Nov 7 19:09 etc 
drwxr-xr-x 3 root  root   4096 Nov 7 17:44 home 
drwxr-xr-x 8 root  root   4096 Nov 7 17:45 lib 
lrwxrwxrwx 1 root  root   12 Oct 18 18:58 linuxrc -> /bin/busybox 
drwxr-xr-x 5 root  root   4096 Oct 18 18:58 media 
drwxr-xr-x 2 root  root   4096 Oct 18 18:58 mnt 
dr-xr-xr-x 141 root  root    0 Nov 7 19:09 proc 
drwx------ 2 root  root   4096 Oct 18 18:58 root 
drwxr-xr-x 2 root  root   4096 Oct 18 18:58 run 
drwxr-xr-x 2 root  root   4096 Nov 7 17:44 sbin 
drwxr-xr-x 2 root  root   4096 Oct 18 18:58 srv 
dr-xr-xr-x 13 root  root    0 Nov 7 19:09 sys 
drwxrwxrwt 2 root  root   4096 Nov 7 17:45 tmp 
drwxr-xr-x 19 root  root   4096 Nov 7 17:45 usr 
drwxr-xr-x 15 root  root   4096 Nov 7 17:44 var 
drwxr-xr-x 10 1001  1001   4096 Nov 7 17:45 zookeeper-3.4.9 
+1

Was ist drin 'docker-entrypoint.sh'? – R0MANARMY

+0

Ich habe in der Frage aktualisiert. – john

+0

Ich habe wieder aktualisiert. lass es mich wissen, wenn du das meinst. Ich bin relativ neu bei Docker, also lassen Sie es mich wissen, wenn ich nichts richtig mache. – john

Antwort

15

Ihre docker-entrypoint.sh nicht ausführbar ist, benötigen Sie einen RUN chmod 755 /docker-entrypoint.sh nach dem COPY Befehl hinzufügen in Ihrer Dockerfile und erstellen Sie das Image neu.

+0

Ok hab es so soll ich das Bild löschen und neu aufbauen. Oder gibt es einen anderen Befehl, der es neu aufbauen kann, ohne es zu löschen? – john

+0

Keine Notwendigkeit zu löschen. Wenn Sie mit demselben Tag neu erstellen, wird das vorherige Tag überschrieben. Und wenn es ungeachtet des Tags neu aufgebaut wird, wird es, wenn es die gleiche Befehl/Bild-Kombination sieht, dieses Zwischenbild wiederverwenden, was den Wiederaufbau sehr schnell macht, wenn sich Ihre Änderungen am Ende der Docker-Datei befinden. Möglicherweise möchten Sie verwaiste Layer nach einer Weile aufräumen, um Speicherplatz zu sparen. – BMitch

+1

'docker images -qf dangling = true - keine-trunc | xargs --no-run-if-docker rmi' ist mein bevorzugter Cleanup-Befehl. – BMitch