2017-05-03 268 views
2

我似乎无法在Dockerfile中运行Composer安装,但是我可以在构建映像并运行容器后在容器中运行。在Dockerfile中运行时,Composer安装不会安装软件包

下面是从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 

但使用了搬运工,撰写容器后:

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

    links: 
     # Link the DB container: 
     - db 

运行搬运工EXEC作曲家安装将正确安装软件包:

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缓存。

+0

尝试只使用一个RUN,如'RUN作曲者...... &&作曲者......' – user2915097

+0

试过了,没有运气。更新问题以包含详细信息。 –

+1

这是因为你的'composer.lock'和'composer.json'在安装的音量上,我猜?然后,原因是在映像创建后实际发生挂载,所以在你的两条'RUN'语句之后 –

回答

1

你的问题是从,docker-compose是为了协调多个泊坞窗容器构建,并在同一时间运行的事实来了,它在某种程度上是不是真的出轻松做什么的现场开始泊坞窗后面的人。

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

  • docker-compose build如果需要的话,并且如果没有现有的(多个)图像的是,如果需要创建图像(多个)
  • docker-compose create,如果有没有容器(一个或多个)还存在,创建容器的容器(一个或多个)
  • docker-compose start开始现有的容器(一个或多个)
  • docker-compose logs日志stderr和标准输出

所以,你必须在那里发现的事实是,包含在你的行动Dockerfile是在图像创建步骤执行的。
在容器启动时执行安装文件夹步骤。

因此,当您尝试使用RUN命令,图像创建步骤的一部分,对安装在启动步骤一样composer.lockcomposer.json文件,你最终有没有通过作曲家安装,因为你的文件不被安装在任何地方然而。

如果你做了一个COPY这些文件可能实际上让你在某个地方,因为你将作为你的图像的一部分作曲家文件。

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

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