2016-07-09 5 views
2

DockerfileApache nicht automatisch auf Docker läuft komponieren bis

FROM phusion/baseimage:0.9.16 
MAINTAINER Raheel <[email protected]> 

# Apache 
RUN apt-get update 
RUN apt-get -y install apache2 

# PHP 
RUN apt-get -y install python-software-properties 
RUN add-apt-repository ppa:ondrej/php 
RUN apt-get update 
RUN apt-get -y install php7.0 
RUN apt-get -y install libapache2-mod-php7.0 php7.0-curl php7.0-json 

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] 

Docker-composer.yaml

version: '2' 
services: 
    frontend: 
    build: ./frontend 
    ports: 
    - "80:80" 
    volumes: 
    - ./frontend:/var/www/html/frontend 

Ich versuche, meine Laravel App innerhalb Docker zu laufen. Ich habe zwei Probleme

1 - Wenn ich docker-compose up ausführen, startet der Apache-Server innerhalb des Containers nicht automatisch. Jedes Mal, wenn ich mich in den Container einloggen muss und service apache2 start tun. Nach meiner Suche fand ich den CMD Befehl ich schrieb in der Dockerfile ist, wie wir Apache starten, aber nicht in meinem Fall

2 - Wenn ich mich in Container anmelden und gehen Sie zu meinem App-Ordner /var/www/html/frontend seine Benutzer sind 1000: 1000 etwas . Ich möchte, dass sie unter www-data stehen: www-data. Aber ich möchte nicht, dass dies in meiner Docker-Datei hinzugefügt wird, da ich meine Docker-Datei nur für die Installation von Apache und PHP behalten möchte. Wie kann ich dies erreichen, indem Sie docker-compose.yaml oder einen anderen Weg verwenden.

Aktualisiert: Docker Container Protokolle

*** Running /etc/my_init.d/00_regen_ssh_host_keys.sh... 
*** Running /etc/rc.local... 
*** Booting runit daemon... 
*** Runit started as PID 9 
Jul 10 08:27:33 6d5c09e83a98 syslog-ng[15]: syslog-ng starting up; version='3.5.3' 

Dank

+0

Wenn der Befehl Apache nicht startet, was macht es dann? Schwer zu debuggen ohne Protokolle und die Ausgabe Ihrer Befehle. – BMitch

+0

Wie kann ich Protokolle sehen? Ich bin auf ubuntu 16 –

+0

'docker-compose logs frontend' – BMitch

Antwort

1

vom Ausgang des Logs das Bild zu urteilen, die ausgeführt wird, wenn Sie docker-compose up tun, ist nicht die CMD verwenden Sie angegeben haben. Dies liegt wahrscheinlich daran, dass das Programm zum ersten Mal erstellt wurde, als Sie docker-compose up ausgeführt haben und es anschließend nicht neu erstellt wurde. Um dies zu umgehen, versuchen Sie es mit docker-compose up --build.

Wenn ich gebaut & Ihr Bild lief (mit dem Docker-compose.yml Ihnen zur Verfügung gestellten) habe ich Apache Start bekommen - mein Ausgang war wie:

Successfully built d65dabcc2595 
Creating apachenotrunningautomaticallyondockercomposeup38280007_frontend_1 
Attaching to apachenotrunningautomaticallyondockercomposeup38280007_frontend_1 
frontend_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.25.0.2. Set the 'ServerName' directive globally to suppress this message 

Ich denke, dass ab Apache auf diese Weise nicht ist Best Practice bei dem Bild, das Sie verwenden, obwohl - der empfohlene Weg wäre mit einem service file als phusion/baseimage verwendet ein benutzerdefiniertes init-System, um zu umgehen some potential issues with Docker.

Sie können ihre empfohlene Vorgehensweise befolgen, indem Sie eine Servicedatei für Apache erstellen. Wenn Sie (in Ihren Frontend-Ordnern) ein Skript erstellen apache.sh genannt (stellen Sie sicher, es ist chmod +x) mit diesem Inhalt:

#! /bin/sh 

exec /usr/sbin/apache2ctl -D FOREGROUND 

Und Ihre Dockerfile zu wie folgt aussehen ändern:

FROM phusion/baseimage:0.9.16 
MAINTAINER Raheel <[email protected]> 

# Apache 
RUN apt-get update 
RUN apt-get -y install apache2 

# PHP 
RUN apt-get -y install python-software-properties 
RUN add-apt-repository ppa:ondrej/php 
RUN apt-get update 
RUN apt-get -y --force-yes install php7.0 
RUN apt-get -y --force-yes install libapache2-mod-php7.0 php7.0-curl php7.0-json 

RUN mkdir /etc/service/apache 
ADD apache.sh /etc/service/apache/run 
RUN chmod +x /etc/service/apache/run 

dann wird es Verwenden Sie das bereitgestellte init-System.

In Antwort auf Ihre zweite Frage ich glaube, Sie 2 wichtigsten Möglichkeiten:

  1. Wenn Sie sie in einem Volumen halten müssen & auf dem Host sowohl den Benutzer zugänglich sein (die mit vermutlich derjenige ist, UID & GID 1000) dann können Sie sicherstellen, dass der Benutzer, der Apache Ihre App ausführt, wie die gleiche UID & GID als Ihr Benutzer auf dem Host hat (erstellen Sie einen anderen Benutzer & Tell Apache, diesen Benutzer in Ihrer Apache-Konfiguration zu verwenden). Dies wird funktionieren, ist aber viel weniger portabel für Systeme, bei denen der Benutzer auf dem Host anders ist.

  2. Fügen Sie diese auf Ihre Dockerfile-and-Drop die Volumenoptionen von Docker-compose.yml:

    RUN mkdir -p /var/www/html/frontend/ 
    COPY . /var/www/html/frontend/ 
    RUN chown -R www-data:www-data /var/www/html/frontend 
    

Wenn es nach mir ginge ich Option 1 für eine Entwicklungsumgebung wählen würde (wie Portabilität wahrscheinlich weniger ein Problem), sondern Option 2 für jede Art von Produktionseinsatz (als großen Vorteil von Docker ist die Unveränderlichkeit von Containern).

+0

Ich habe versucht, Ihre Lösung es mir 'Frontend_1 | runsv apache: fatal: kann nicht gestartet werden ./run: access denied '. Ich habe bereits chmod + x run.sh –

+0

Es ist seltsam. Ich behielt meinen Dateinamen start.sh anstelle von apache.sh, es funktionierte nicht jetzt, ich genau benanntes ist apache.sh und laufe es wieder, das funktioniert. Warum ist das so ... –

+0

Übrigens vielen Dank für eine solche Detailerklärung. –