24

I have a small theoretical problem with combination of php-fpm, nginx and app code in Docker.

I'm trying to stick to the model when docker image does only one thing -> I have separate containers for php-fpm and nginx.

php:
    image: php:5-fpm-alpine
    expose:
        - 9000:9000
    volumes:
        - ./:/var/www/app

nginx:
    image: nginx:alpine
    ports:
        - 3000:80
    links:
        - php
    volumes:
        - ./nginx/app.conf:/etc/nginx/conf.d/app.conf
        - ./:/var/www/app

NOTE: In app.conf is root /var/www/app; Example schema from Symfony

This is great in development, but I don't know how to convert this to production ready state. Mount app directory in production is really bad practice (if I'm not wrong). In best case I copy app source code into container and use this prebuilded code (COPY . /var/www/app in Dockerfile), but in this case is impossible or I don't know how.

I need share app source code between two contatiner (nginx container and php-fpm container) because booth of that need it.

Of course I can make own nginx and php-fpm container and add COPY . /var/www/app into both of them, but I thing that is wrong way because I duplicate code and the whole build process (install dependencies, build source code, etc...) must be in both (nginx/php-fpm) containers.

I try to search but I don't find any idea how to solve this problem. A lot of articles show how to do this with docker-compose file and mount code with --volume but I didn't find any example how to use this on production (without volume).

Only one acceptable solutions for me (in this time) is make one container with nginx and php-fpm together but I'm not sure when is a good way (I try to find best practice).

Do you have any experiences with this or any idea how to solve it?

Thanks for any response!

1
  • 1
    same problem :( i need help too Commented May 1, 2017 at 7:08

2 Answers 2

6

I solve the problem by making a shared volume with the docker-compose file:

version: '3'

volumes:
 share_place:

services:
 php:
  image: php:5-fpm-alpine
  ports:
   - 9000:9000
  volumes:
   - share_place:/var/www/app
 nginx:
  image: nginx:alpine
  ports:
   - 3000:80
  volumes:
   - share_place:/var/www/app

This will create a volume share_place that will share the data between the two container.

Sign up to request clarification or add additional context in comments.

Comments

4

At this time I use smth like:

Dockerfile:

FROM php:fpm
COPY . /var/www/app/
WORKDIR /var/www/app/
RUN composer install
EXPOSE 9000
VOLUME /var/www/app/web

Dockerfile.nginx

FROM nginx
COPY default /etc/nginx/default

docker-compose.yml

app:
  build:
    context: .
web:
  build:
    context: .
    dockerfile: Dockerfile.nginx
  volumes_from: app  

But in few days on 17.05 release we can do in one Dockerfile smth like:

FROM php:cli AS builder
COPY . /var/www/app/
WORKDIR /var/www/app/
RUN composer install && bin/console assets:dump

FROM php:fpm AS app
COPY --from=builder /var/www/app/src /var/www/app/vendor /var/www/app/
COPY --from=builder /var/www/app/web/app.php /var/www/app/vendo /var/www/app/web/

FROM nginx AS web
COPY default /etc/nginx/default
COPY --from=builder /var/www/app/web /var/www/app/web

3 Comments

Using multistage build in this way will not solve the problem. If you run this dockerfile, only one image is created (the one with the latest FROM instruction).
@JimPanse there are docker build --target option & target key in build section of docker.compose
Thats right! I found that option yesterday ... with this option, building images is amazing!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.