在Dockerfile

时间:2017-05-03 20:49:27

标签: docker composer-php docker-compose

我似乎无法在Dockerfile中运行composer install,但是在构建映像并运行容器后我可以在容器中运行。

这是来自Dockerfile的命令:

RUN composer require drupal/video_embed_field:1.5
RUN composer install --no-autoloader --no-scripts --no-progress

输出结果为:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update

但在使用docker-compose运行容器之后:

...
drupal:
    image: docker_image
    container_name: container
    ports:
      - 8081:80
    volumes:
      - ./container/modules:/var/www/html/web/modules

    links:
      # Link the DB container:
      - db

运行docker exec composer install将正确安装软件包:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 1 installs, 0 updates, 0 removals
...
Generating autoload files

我假设composer.json和composer.lock文件是正确的,因为我可以在容器中运行composer install命令而不需要任何进一步的努力,但只有在容器运行之后。

更新 尝试将作曲家命令与:

结合起来
RUN composer require drupal/video_embed_field:1.5 && composer install

同样的问题,“无需安装或更新”。最后,我想继续在Dockerfile中使用单独的RUN语句来利用docker缓存。

2 个答案:

答案 0 :(得分:3)

你的问题来自这样一个事实:docker-compose是为了协调多个docker容器构建并同时运行而且它在某种程度上并没有真正显示它对于以docker开头的人们在幕后的作用

docker-compose up后面有四个步骤:

  • docker-compose build如果需要,如果还没有现有图片,请创建图像
  • docker-compose create如果需要,如果还没有容器存在,请创建容器
  • docker-compose start启动现有容器
  • docker-compose logs记录容器的stderr和stdout

所以你必须在那里看到的是,包含在你身上的动作Dockerfile是在图像创建步骤中执行的。
在容器步骤开始时执行安装文件夹。

因此,当您尝试使用RUN命令(图像创建步骤的一部分),在composer.lockcomposer.json等文件上安装启动步骤时,您最终无所事事通过composer安装,因为你的文件还没有安装在任何地方。

如果您执行了COPY那些可能实际上让您到达某处的文件,因为您将把作曲家文件作为图像的一部分。

这就是说,小心安装的源文件夹将完全覆盖安装点,这样你最终可能会期望一个供应商文件夹而没有它。
理想情况下,您应该将其作为ENTRYPOINT,这是在容器启动的最后一步发生的。

这是一个小小的开发比较:一个docker镜像是一个docker容器,类是一个类的实例 - 一个对象。
您的容器都是根据可能很久以前构建的图像创建的 Dockerfile中的大多数步骤都是在创建图像时发生的,而不是在容器启动时发生的 虽然docker-compose的大部分指令都是针对容器构建的自动化,包括文件夹的安装。

答案 1 :(得分:0)

当卷安装覆盖容器内的composer文件时,只需注意一种docker-compose.yml方法即可解决此问题:

docker-compose.yml

environment:
  PROJECT_DIR: /var/www/html
volumes:
  - ./php/docker/entrypoint/90-composer-install.sh:/docker-entrypoint-init.d/90-composer-install.sh

composer-install.sh

#!/usr/bin/env bash

cd ${PROJECT_DIR}
composer install

这将在构建后使用docker-entrypoint-init.d shell脚本运行composer安装