如何通过ngfx图像将来自php-fpm图像的静态文件服务器化

时间:2019-03-25 21:24:38

标签: php docker nginx docker-compose static-files

我有一个基于Symfony框架的Web应用程序。

我有一个包含所有php和资产文件的php-fpm映像。

现在,我想通过nginx容器提供文件。 php部分很简单。但是,如何提供php-fpm映像中包含的静态文件?

我试图创建两个容器都挂载的卷。但是在第一次启动后docker将映像文件中的文件复制到卷中之后,我更新映像后文件不再更新。

我可以在容器启动后将文件从第二个目录复制到卷中,以解决此问题,但是我不希望有此开销。

任何人都可以共享静态文件,以便可以由nginx容器直接提供服务吗?

我的docker-compose:

version: '3'
services:
    nginx:
        image: nginx:1.15-alpine
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./data/nginx:/etc/nginx/conf.d
            - ./data/certbot/conf:/etc/letsencrypt
            - ./data/certbot/www:/var/www/certbot
            - static-content:/var/www/app/web
        command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

    php:
        image: pbnl/scotoobo-php:dev
        volumes:
            - static-content:/var/www/app/web
        environment:
            - database_host=db
volumes:
  static-content:

我的Dockerfile

FROM php:7.1-fpm
RUN usermod -u 1000 www-data
RUN groupmod -g 1000 www-data

ENV APP_ENV=prod
ENV SYMFONY_ENV=prod

# install system basics
# install some php extensions
# install composer

WORKDIR /var/www/app

# copy the source code
COPY composer.* ./
COPY app app
COPY bin bin
COPY src src
COPY web web-tmp

# set up correct permissions to run the next composer commands 
RUN mkdir var
RUN mkdir var/logs
RUN mkdir var/cache
RUN chown -R www-data:www-data /var/www/
RUN find /var/www/ -type d -exec chmod 775 "{}" \;
RUN find /var/www/ -type f -exec chmod 664 "{}" \;
RUN find /var/www -type d -exec chmod g+s "{}" \;

# generate the autoloaders and run composer scripts
USER www-data
RUN composer install --no-dev --optimize-autoloader --no-interaction --no-scripts

1 个答案:

答案 0 :(得分:0)

volume选项不是一个不错的解决方案,它应该可以为您服务。如果您要共享dockerfile和docker-compose,我想帮助您找到丢失的内容。

我为您提供的另一个解决方案是设置3个容器-php-fpm容器,nginx容器和另一个用于服务共享文件的容器。 (确实适合nginx容器)。

第三个容器不会将其端口发布到docker子网之外。只有其他2个容器可以访问它,并作为其代理。

在这里https://github.com/Efrat19/django-nginx-docker,我有一个位于django服务器容器前面的nginx代理的示例,该代理不能直接在docker子网外部访问。将django服务器替换为配置为提供静态文件的简单nginx服务器,您就可以了。