title: Docker compose for Nginx/PHP-FPM/Composer
body: <p>I am trying to setup Docker for my application relying on an LEMP stack. To this end, I plan to use Docker compose in order to spawn one container for Nginx, one for PHP-FPM and one for MySQL.</p>
  
  <p>This is all working well for the basic illustration use-cases found in the online tutorials, but when I try to apply it to my use-case, I struggle with a design issue.</p>
  
  <p>To give a bit of context, my web application relies on Composer for PHP dependencies and Gulp+Bower for CSS/JS dependencies (and LESS compilation, assets minimization, etc.).</p>
  
  <p>The problem is that I need to build the application (i.e. install all dependencies and run some gulp tasks) and provide the result of this build to both Nginx and PHP-FPM containers.</p>
  
  <p>Here is what I have come to so far:</p>
  
  <p><strong>docker-compose.yml:</strong></p>
  
  <pre><code>version: "3"
  
  networks:
    database:
    server:
  
  volumes:
    mysql-data:
    source:
  
  services:
    php:
      build: .
      volumes:
        - source:/app:ro
      restart: always
      networks:
        - database
        - server
      depends_on:
        - mysql
  
    mysql:
      image: mysql:5.7
      volumes:
        - mysql-data:/var/lib/mysql
      restart: always
      networks:
        - database
      environment: 
        MYSQL_ROOT_PASSWORD: rootpassword
        MYSQL_USER: test
        MYSQL_PASSWORD: test
        MYSQL_DATABASE: test
  
    nginx:
      image: nginx
      volumes:
        - source:/app:ro
      restart: always
      networks:
        - server
      depends_on:
        - php
  </code></pre>
  
  <p><strong>Dockerfile:</strong></p>
  
  <pre><code>FROM php:7.1-fpm
  WORKDIR /app
  
  # Install dependencies
  RUN curl -sL https://deb.nodesource.com/setup_8.x | bash -
  RUN apt-get update &amp;&amp; apt-get install -y \
      git \
      nodejs \
      zip
  RUN curl -sL https://getcomposer.org/installer | php -- --install-dir /usr/bin --filename composer
  
  # Get application dependencies
  COPY composer.json ./
  RUN composer install -o
  
  COPY package.json gulpfile.js bower.json ./
  RUN npm install
  RUN npm run gulp
  RUN npm run rev
  
  # Copy application
  COPY . ./
  </code></pre>
  
  <p>However, as a Docker beginner, I am not sure it is right to rely on a volume for the build result of the application, or to have the build steps part of one of the containers running the application.</p>
  
  <p>Thanks in advance for any help or advice!</p>
  
  <p>Nicolas</p>