了解如何将Symfony应用程序复制到多阶段构建的docker容器中

93 阅读2分钟

在这个例子中,我们将运行composer来安装Symfony应用程序的依赖项,然后将vendor 文件夹和其他应用程序文件复制到容器镜像中。通过这种方式,我们的镜像将总是默认带有应用程序,所以我们所要做的就是创建一个容器并开始使用它。这是一个众所周知的做法,但我只想谈谈一个基本的实现。其主要目的是隔离应用程序代码,不将其暴露在主机操作系统上。我不打算在这里列举这些好处,因为它们都已经在互联网上写过了。这个解决方案的主要问题是,最终的docker镜像的大小将取决于应用程序和vendor 文件夹的大小。

结构

.
├── bin
│   └── ...
├── composer.json
├── composer.lock
├── Readme.md
├── symfony.lock
├──.env
├──.gitignore
├──.dockerignore
├── config
│   └── ...
├── docker
│   ├── docker-compose.yml
│   ├── Makefile
│   ├── nginx
│   │   ├── app.conf
│   │   ├── Dockerfile
│   │   └── nginx.conf
│   └── php
│       ├── Dockerfile
│       ├── init.sh
│       ├── php.ini
│       └── www.conf
├── public
│   └── index.php
├── src
│   └── ...
├── var
│   └── ...
└── vendor
      └── ...

文件

我只是展示了重要文件的内容。其余的就不太重要了。

.dockerignore

config/packages/dev/
config/packages/test/
var/
vendor/
.dockerignore
.gitignore
*.md

.git/
.idea/
.DS_Store/

docker-compose.yml

version: "3.4"

services:

  sport_php:
    build:
      context: ".."
      dockerfile: "docker/php/Dockerfile"
    hostname: "sport-php"
    environment:
      PS1: "\\u@\\h:\\w\\$$ "

  sport_nginx:
    build:
      context: ".."
      dockerfile: "docker/nginx/Dockerfile"
    hostname: "sport-nginx"
    ports:
      - "1080:80"
    depends_on:
      - "sport_php"
    environment:
      PS1: "\\u@\\h:\\w\\$$ "

制作文件

build:
	@docker-compose build

up:
	@docker-compose up -d

nginx/Dockerfile

FROM nginx:1.15.8-alpine

WORKDIR /app

COPY public/index.php /app/public/index.php

COPY docker/nginx/app.conf /etc/nginx/conf.d/default.conf
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf

php/Dockerfile

#
# STAGE 1: composer
#
FROM composer:1.8.5 as composer

COPY composer.* /app/

RUN set -xe \
 && composer install --no-dev --no-scripts --no-suggest --no-interaction --prefer-dist --optimize-autoloader

COPY . /app

RUN composer dump-autoload --no-dev --optimize --classmap-authoritative

#
# STAGE 2: php
#
FROM php:7.2.13-fpm-alpine3.8

RUN apk update \
 && apk add --no-cache $PHPIZE_DEPS \
    git \
    zip \
    unzip \
 && docker-php-ext-install \
    opcache \
    pdo_mysql \
 && docker-php-ext-enable \
    opcache \
 && rm -rf \
    /var/cache/apk/* \
    /var/lib/apt/lists/*

WORKDIR /app

COPY . /app

COPY --from=composer /app/vendor /app/vendor

COPY docker/php/php.ini /usr/local/etc/php/conf.d/php.override.ini
COPY docker/php/www.conf /usr/local/etc/php-fpm.d/www.conf
COPY docker/php/init.sh /usr/local/bin/init.sh

RUN chmod +x /usr/local/bin/init.sh

CMD ["/usr/local/bin/init.sh"]

php/init.sh

#!/bin/sh
set -e

bin/console cache:warm

php-fpm --nodaemonize

构建和检查

$ make -sC docker/ build up
$ docker images
REPOSITORY           TAG                    IMAGE ID            CREATED             SIZE
docker_sport_php     latest                 c7d3ba4a4c3a        22 hours ago        302MB
docker_sport_nginx   latest                 267a1d054046        22 hours ago        16.1MB
composer             1.8.5                  78e8c9802c21        4 days ago          161MB
nginx                1.15.8-alpine          b411e34b4606        4 months ago        16.1MB
php                  7.2.13-fpm-alpine3.8   262e46e3d43c        5 months ago        77.7MB
$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                  NAMES
b0faa127f7d4        docker_sport_nginx   "nginx -g 'daemon of…"   22 hours ago        Up 22 hours         0.0.0.0:1080->80/tcp   docker_sport_nginx_1
f929370e4a0e        docker_sport_php     "docker-php-entrypoi…"   22 hours ago        Up 22 hours         9000/tcp               docker_sport_php_1
$ docker exec -it docker_sport_nginx_1 ls -l public
-rw-r--r--    1 root     root           798 May 16 07:50 index.php
$ docker exec -it docker_sport_php_1 ls -la
-rw-r--r--    1 root     root           279 May 16 09:10 .env
drwxr-xr-x    2 root     root          4096 May 16 07:50 bin
-rw-r--r--    1 root     root          1443 May 16 08:10 composer.json
-rw-r--r--    1 root     root        118858 May 16 08:10 composer.lock
drwxr-xr-x    4 root     root          4096 May 17 07:00 config
drwxr-xr-x    4 root     root          4096 Jun  4 20:32 docker
drwxr-xr-x    2 root     root          4096 May 16 07:50 public
drwxr-xr-x    8 root     root          4096 May 17 07:00 src
-rw-r--r--    1 root     root          5998 May 16 08:10 symfony.lock
drwxrwxrwx    4 root     root          4096 Jun  4 20:33 var
drwxr-xr-x   11 root     root          4096 Jun  4 20:32 vendor

如果你在终端运行$ curl -i 0.0.0.0:1080 命令,应用程序应该可以工作。