我需要在我的项目中实例供应商有问题。
我的 php 码头文件
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-compose
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 中,我无法访问它们。我想知道我如何正确构建图像以使用纤薄的框架和其他图像而不会出错。
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 卷并将供应商放入 php 数据中
我认为 docker 多阶段构建了一个强大的机制,您可以使用它来实现轻量级容器。
对于多阶段构建,您可以在 Dockerfile。每个 FROM 指令都可以使用不同的基库,并且每个 他们开始了构建的新阶段。您可以有选择地复制 从一个阶段到另一个阶段的人工制品,留下了你的一切 不想出现在最终图像中。
作曲家并不苗条,我不明白为什么它应该驻留在你的最终图像中。 如果我是你,我会创建一个作曲家阶段,在那里我复制项目并运行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
的 Volume 语句中排除供应商 DIR,这样它就不会被覆盖:
php:
container_name: php
build: ./docker/php7
volumes:
- ./public:/var/www/html
- /var/www/html/vendor