在Dockerfile中运行时,Composer安装不会安装软件包

我似乎无法在Dockerfile中运行composer php安装,但我可以在构build图像和运行容器后在容器中。

这里是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执行composer php安装将正确安装包:

 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命令,而无需进一步的努力,但只能在容器运行之后。

更新试图结合composer命令:

 RUN composer require drupal/video_embed_field:1.5 && composer install 

同样的问题,“没有安装或更新”。 最终,我想继续在Dockerfile中使用单独的RUN语句来利用dockercaching。

你的问题来源于这样一个事实,即docker-compose是为了协调多个docker容器的构build并同时运行,而且不知怎的,它并没有真正地向docker开始的人们展示它背后的function。

docker-compose up背后docker-compose up共有四个步骤:

  • docker-compose build如果需要,如果没有现有的图像(S),创build图像(S)
  • docker-compose create如果需要的话docker-compose create ,如果没有容器存在,创build容器(s)
  • docker-compose start启动现有容器(s)
  • docker-compose logslogging容器的stderr和stdout

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

所以,当你尝试使用一个RUN命令(图像创build步骤的一部分)的时候,在composer.lockcomposer.json这样的文件上,这些文件在启动步骤中被安装完毕,最终没有任何东西需要通过编辑器来安装,因为你的文件没有安装到任何地方然而。

如果您将这些文件COPY到某个地方,您可能会将作曲文件作为图像的一部分。

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

这是一个小小的发展比较:一个泊坞窗图像是一个docker容器什么类是一个类的实例 – 一个对象。
你的容器都是根据可能很久以前build立的图像创build的。
Dockerfile大部分步骤Dockerfile在创buildDockerfile时进行的,而不是在容器启动时进行的。
虽然docker-compose的大部分指令都是针对容器构build的自动化,其中包括安装文件夹。