如何在docker-compose中使用composer?

21

我正在配置docker-compose.yml文件,希望运行一个包含Elastic, Redis, Symfony和composer的PHP堆栈。

现在我遇到的问题是,我不知道如何在Docker中使用composer,因为一些Composer特性需要PHP和一些扩展。我不想构建一个新的镜像,并在上面安装Nginx、PHP、Composer和PHP扩展,我希望它们都在不同的镜像中。

目前为止我尝试过的方法如下:

version : '2'

services:
  nginx:
    image: tutum/nginx
    ports:
        - "80:80"
    volumes:        
        - ./nginx/default:/etc/nginx/sites-available/default
        - ./nginx/default:/etc/nginx/sites-enabled/default
        - ./logs/nginx-error.log:/var/log/nginx/error.log
        - ./logs/nginx-access.log:/var/log/nginx/access.log
        - ./app:/usr/share/nginx/html

  phpfpm:
      image: php:fpm
      ports:
          - 9000:9000
      volumes:      
          - ./app:/usr/share/nginx/html
          
  composer:
      image: composer/composer:php7
      command: install
      volumes: 
        - ./app:/app

  elastic2.4.4:
    image: elasticsearch:2.4.4    
    ports:
      - 9200:9200
    volumes:
      - ./esdata1:/usr/share/elasticsearch/data

  redis:
    image: redis:3.2
    ports:
      - 6379:6379

但是这不会安装依赖项。


你看过这个吗?https://github.com/maxpou/docker-symfony - Fendi jatmiko
2个回答

6
我设置了我的 docker-compose.yml 文件,以便一个 Docker 实例使用 composer/composer 镜像,并在共享容器中执行 composer install。然后,所有其他镜像都能够访问 composer 创建的 vendor 目录。棘手的部分是意识到 composer/composer 镜像假定 composer.json 文件将在 /app 目录中。我必须通过指定我的共享容器作为 working_dir 来覆盖此行为:
version: '3'

services:
  #=====================#
  # nginx proxy service #
  #=====================#
  nginx_proxy:
    image: nginx:alpine
    networks:
      - test_network
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # self-signed testing wildcard ssl certificate
      - "./certs:/certs"
      # proxy needs access to static files
      - "./site1/public:/site1/public"
      - "./site2/public:/site2/public"
      # proxy needs nginx configuration files
      - "./site1/site1.test.conf:/etc/nginx/conf.d/site1.test.conf"
      - "./site2/site2.test.conf:/etc/nginx/conf.d/site2.test.conf"
    container_name: nginx_proxy

  #===============#
  # composer.test #
  #===============#
  composer.test:
    image: composer/composer
    networks:
      - test_network
    ports:
      - "9001:9000"
    volumes:
      - "./composer:/composer"
    container_name: composer.test
    working_dir: /composer
    command: install

  #============#
  # site1.test #
  #============#
  site1.test:
    build: ./site1
    networks:
      - test_network
    ports:
      - "9002:9000"
    environment:
      - "VIRTUAL_HOST=site1.test"
    volumes:
      - "./composer:/composer"
      - "./site1:/site1"
    container_name: site1.test

  #============#
  # site2.test #
  #============#
  site2.test:
    build: ./site2
    networks:
      - test_network
    ports:
      - "9003:9000"
    environment:
      - "VIRTUAL_HOST=site2.test"
    volumes:
      - "./composer:/composer"
      - "./site2:/site2"
    container_name: site2.test

# networks
networks:
  test_network:

以下是目录结构的样子:

certs
    test.crt
    test.key
composer
    composer.json
site1
    app
    public
    Dockerfile
    site1.test.conf
site2
    app
    public
    Dockerfile
    site2.test.conf
docker-compose.yml

3
如果您查看composer/composer:php7 Dockerfile,您会发现它基于php:7.0-alpine,并且似乎没有包含fpm。因此,您可以使用composer/composer:php7作为基础镜像,在其上安装php-fpm
因此,由于您在所有三个容器中进行项目映射,因此在一个容器中运行composer install应该会导致所有三个容器中的更改可见。
就我个人而言,我不认为将PHP和nginx分开到2个不同的容器中有任何意义,因为一个高度依赖于另一个。同时将您的应用程序映射到两个容器中也是毫无意义的完美例子。这就是为什么我维护自己的公共构建nginx + php Docker镜像。您可以在此处查看。还有更多带有更多口味的构建。它们都内置了composer。

那张图片很好用 - 但据我所知没有文档; 网络用户是什么?网络根目录的路径是什么?等等... - Peter Kionga-Kamau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接