2016-03-20 23 views
4

Ich führe Docker 1.8.1 in OSX 10.11 über eine lokale Docker-Maschine VM aus.Falsche Volumenberechtigungen im Docker Container

Ich habe folgende Docker-compose.yml:

web: 
    build: docker/web 
    ports: 
     - 80:80 
     - 8080:8080 
    volumes: 
     - $PWD/cms:/srv/cms 

Meine Dockerfile wie folgt aussieht:

FROM alpine 

# install nginx and php 
RUN apk add --update \ 
    nginx \ 
    php \ 
    php-fpm \ 
    php-pdo \ 
    php-json \ 
    php-openssl \ 
    php-mysql \ 
    php-pdo_mysql \ 
    php-mcrypt \ 
    php-ctype \ 
    php-zlib \ 
    supervisor \ 
    wget \ 
    curl \ 
    && rm -rf /var/cache/apk/* 

RUN mkdir -p /etc/nginx && \ 
    mkdir -p /etc/nginx/sites-enabled && \ 
    mkdir -p /var/run/php-fpm && \ 
    mkdir -p /var/log/supervisor && \ 
    mkdir -p /srv/cms 

RUN rm /etc/nginx/nginx.conf 
ADD nginx.conf /etc/nginx/nginx.conf 
ADD thunder.conf /etc/nginx/sites-enabled/thunder.conf 

ADD nginx-supervisor.ini /etc/supervisor.d/nginx-supervisor.ini 

WORKDIR "/srv/cms" 
VOLUME "/srv/cms" 

EXPOSE 80 
EXPOSE 8080 
EXPOSE 22 

CMD ["/usr/bin/supervisord"] 

Wenn ich alles laufen mit docker-compose up alles gut funktioniert, sind meine Bände an die montierte Richtiger Platz.

Aber die Berechtigungen im bereitgestellten Ordner/srv/cms sehen falsch aus. Der Benutzer ist "1000" und die Gruppe ist "50" in dem Container. Der Webserver konnte keine Dateien in diesem Ordner erstellen, da er mit dem Benutzer "root" läuft.

+0

Wenn es mit 'root' läuft, sollte es in der Lage sein, einen beliebigen Ordner zu schreiben. Gibt Ihre Supervisor-Konfiguration einen anderen Benutzer an? Ist "uid 1000" und "gid 50" der Benutzer auf Ihrem OS X? –

Antwort

5

1) Allgemeine Idee: Docker ist es nicht Vagrant. Es ist falsch, zwei verschiedene Dienste in einen Container zu legen! Teile es in zwei verschiedene Bilder und verknüpfe sie miteinander. Mach dieses beschissene Bild nicht.

überprüfen und folgen https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

  • Vermeiden Installation unnötige Pakete
  • Run nur ein Prozess pro Behälter
  • Minimieren Sie die Anzahl der Schichten

Wenn Sie es tun:

  • FROM alpine 
    
    RUN apk add --update \ 
        wget \ 
        curl 
    RUN apk add --update \ 
        php \ 
        php-fpm \ 
        php-pdo \ 
        php-json \ 
        php-openssl \ 
        php-mysql \ 
        php-pdo_mysql \ 
        php-mcrypt \ 
        php-ctype \ 
        php-zlib 
    RUN usermod -u 1000 www-data 
    RUN rm -rf /var/cache/apk/* 
    
    EXPOSE 9000 
    

    Für nginx ist es genug, um Standardbild zu verwenden und montieren configs: Sie Ihren Vorgesetzten

  • Ihre abnehmen kann Zahlen von Schichten

Es sollte so etwas wie (Beispiel) sein entfernen. Docker-compose Datei wie:

nginx: 
    image: nginx 
    container_name: site.dev 
    volumes: 
    - ./myconf1.conf:/etc/nginx/conf.d/myconf1.conf 
    - ./myconf2.conf:/etc/nginx/conf.d/myconf2.conf 
    - $PWD/cms:/srv/cms 
    ports: 
    - "80:80" 
    links: 
    - phpfpm 
phpfpm: 
    build: ./phpfpm/ 
    container_name: phpfpm.dev 
    command: php5-fpm -F --allow-to-run-as-root 
    volumes: 
    - $PWD/cms:/srv/cms 

2) RUN usermod -u 1000 www-data in Dockerfile für PHP-Container hinzufügen, wird es Problem mit Erlaubnis beheben.

+1

Alpine unterstützt 'userrod' nicht von Anfang an. Sie müssen das Paket 'shadow' aus dem Zweig' tests' installieren. –