【问题标题】:Dockerfile with nginx, mysql, php7 and slimphp带有 nginx、mysql、php7 和 slimphp 的 Dockerfile
【发布时间】:2019-12-03 07:20:53
【问题描述】:

我需要对我项目中的供应商实例有问题。

我的 php dockerfile

FROM php:7.2.1-fpm

RUN apt-get update

# Install tools
RUN apt-get install -y \
    python-setuptools \
    software-properties-common \
    wget \
    git \
    curl \
    zip \
    vim

RUN echo 'deb http://httpredir.debian.org/debian jessie contrib' >> /etc/apt/sources.list

RUN apt-get update
RUN export DEBIAN_FRONTEND=noninteractive && apt-get install -y --force-yes libssl-dev curl  libcurl4-gnutls-dev libxml2-dev libicu-dev libmcrypt4 libmemcached11 openssl

#CONFIGURAÇÕES DO OPCACHE
RUN docker-php-ext-install opcache

#CONFIGURAÇÕES DO APCU
RUN pecl install apcu-5.1.5 && docker-php-ext-enable apcu

#LIBS EXTRAS
RUN docker-php-ext-install bcmath
RUN apt-get install -y libbz2-dev
RUN docker-php-ext-install bz2
RUN docker-php-ext-install mbstring
RUN apt-get install -y libpq-dev
RUN apt-get install -y libicu-dev
RUN docker-php-ext-install intl

#GD
RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng16-16
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install gd

#PDO
RUN docker-php-ext-install pdo_mysql

#sudo
RUN apt-get update && apt-get install -y sudo && rm -rf /var/lib/apt/lists/*    

VOLUME /var/www/html
WORKDIR /var/www/html
RUN pwd

# Allow Composer to be run as root
ENV COMPOSER_ALLOW_SUPERUSER 1

# Install composer
RUN wget https://getcomposer.org/download/1.5.5/composer.phar
RUN chmod +x composer.phar
RUN sudo mv composer.phar /usr/local/bin/composer

# Install libs/var_dumper
RUN mkdir -p /var/.composer
RUN composer global --no-interaction --working-dir=/var/.composer require slim/slim

EXPOSE 9000

CMD ["php-fpm"]

我只想将供应商文件夹移动到 var/www/html

Docker 编写

nginx:
  container_name: nginx
  build: ./docker/nginx
  ports:
    - "80:80"
  volumes:
    - ./public:/var/www/html
  links:
        - php
        - mysql

php:
  container_name: php
  build: ./docker/php7
  volumes:
    - ./public:/var/www/html
  ports:
    - "9000:9000"
  links:
    - mysql

mysql:
  image: mysql:5.7
  restart: always
  ports:
    - "3306:3306"
  environment:
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=testedb

供应商文件位于 /var/.composer 中,我无法访问它们。 我想知道我如何正确构建图像以使用超薄框架和其他图像而不会出错。

【问题讨论】:

    标签: php mysql docker nginx docker-compose


    【解决方案1】:

    Dockerfile

    FROM php:7.2-fpm
    
    # Install dependencies
    RUN apt-get update && apt-get install -y \
        build-essential \
        libpng-dev \
        libjpeg62-turbo-dev \
        libfreetype6-dev \
        locales \
        zip \
        jpegoptim optipng pngquant gifsicle \
        vim \
        unzip \
        git \
        curl
    
    RUN docker-php-ext-install mysqli   
    
    # Clear cache
    RUN apt-get clean && rm -rf /var/lib/apt/lists/*
    
    # Install extensions
    RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
    RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
    RUN docker-php-ext-install gd
    
    # Install composer
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    
    # Copy composer.lock and composer.json
    COPY composer.json /var/www/html
    
    # Copy existing application directory contents
    COPY . /var/www/html
    
    # Set working directory
    WORKDIR /var/www/html
    
    RUN composer install
    
    # Expose port 9000 and start php-fpm server
    EXPOSE 9000
    
    CMD ["php-fpm"]
    

    Docker-compose.yml

    version: '3'
    
    services:
    
      #PHP Service
      app:
        build:
          context: .
          dockerfile: Dockerfile
        image: digitalocean.com/php
        container_name: app
        restart: unless-stopped
        tty: true
        environment:
          SERVICE_NAME: app
          SERVICE_TAGS: dev
        volumes:
          - ./:/var/www/html
          - php-data:/var/www/html/vendor/
          - ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
        networks:
          - app-network
    
      #Nginx Service
      webserver:
        image: nginx:alpine
        container_name: webserver
        restart: unless-stopped
        tty: true
        ports:
          - "80:80"
          - "443:443"
        volumes:           
          - ./:/var/www/html
          - ./docker/nginx/conf.d/:/etc/nginx/conf.d/
        networks:
          - app-network
    
      #MySQL Service
      db:
        image: mysql:5.7.22
        container_name: db
        restart: unless-stopped
        tty: true
        ports:
          - "3306:3306"
        environment:
          MYSQL_DATABASE: testedb
          MYSQL_ROOT_PASSWORD: root
          SERVICE_TAGS: dev
          SERVICE_NAME: mysql
        volumes:
          - dbdata:/var/lib/mysql/
          - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
        networks:
          - app-network
    
    #Docker Networks
    networks:
      app-network:
        driver: bridge
    #Volumes
    volumes:
      dbdata:
        driver: local
      php-data:
    

    我这样做,创建 3 个卷并将 vendor 放入 php-data

    【讨论】:

    • 有趣...但是您必须自己手动安装供应商目录,不是吗?
    • 不,它是自动创建的,在我的 github 中检查,但是是葡萄牙语。之后我可以翻译。
    • 嗨@Breno,看起来不错。您的容器中安装了作曲家,而我的解决方案并非如此。我认为我的可以帮助您实现更轻量级的容器。无论如何,祝你好运,
    【解决方案2】:

    我认为docker multistage build 是一种强大的机制,您可以使用它来实现轻量级容器。

    对于多阶段构建,您可以在您的程序中使用多个 FROM 语句 Docker 文件。每个 FROM 指令可以使用不同的基数,并且每个 其中开始了构建的新阶段。您可以选择性地复制 从一个阶段到另一个阶段的文物,留下你的一切 不希望出现在最终图像中。

    composer 并不苗条,我不明白为什么它应该驻留在您的最终图像中。如果我是你,我会创建一个作曲家阶段,在其中复制项目并运行composer install。然后我会将vendor 目录作为工件复制到最后阶段,这根本不会安装作曲家。这是一个基本的例子:

    #create vendor:
    FROM prooph/composer:7.3 as vendor-installer
    WORKDIR /var/www/html
    COPY . .
    RUN composer install
    
    #final stage
    FROM php:7.2.1-fpm
    WORKDIR /var/www/html
    COPY --from vendor-installer /var/www/html/vendor vendor
    

    编辑

    您还必须从 docker-compose.yml 的卷语句中排除供应商目录,这样它就不会被覆盖:

    php:
      container_name: php
      build: ./docker/php7
      volumes:
        - ./public:/var/www/html
        - /var/www/html/vendor 
    

    【讨论】:

    • 感谢您的帮助,我理解并测试了您的代码。但是做同样的事情,在决赛中不要将供应商文件夹复制到 www/html。我猜我的 docker-compose.yml 是错误的。
    • @BrenoSobral 这可能是因为数量。你必须把它排除在外。我教你怎么做。
    • 我会发布解决方案。
    猜你喜欢
    • 2020-10-05
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多