我似乎无法在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命令而不需要任何进一步的努力,但只有在容器运行之后 .
Update 尝试将composer命令与:
RUN composer require drupal/video_embed_field:1.5 && composer install
同样的问题,“无需安装或更新” . 最后,我想继续在Dockerfile中使用单独的RUN语句来利用docker缓存 .
1 回答
你的问题来自这样一个事实:
docker-compose
是为了编排多个docker容器构建并同时运行,并且它在某种程度上并没有真正显示它对于以docker开头的人所做的幕后操作 .docker-compose up
背后有四个步骤:docker-compose build
如果需要,如果还没有现有图像,请创建图像docker-compose create
如果需要,如果还没有容器存在,请创建容器docker-compose start
启动现有容器docker-compose logs
记录容器的stderr和stdout所以你必须在那里看到的是,包含在你身上的动作
Dockerfile
是在图像创建步骤中执行的 .在容器步骤开始时执行安装文件夹 .
因此,当您尝试使用
RUN
命令(图像创建步骤的一部分),在启动步骤中安装的文件(如composer.lock
和composer.json
)时,您最终无法通过编写器安装任何内容,因为您的文件尚未安装在任何位置 .如果您执行的某些文件实际上可能会让您到达某个地方,那么您将使用作曲家文件作为图像的一部分 .
这就是说,要小心安装的源文件夹将完全覆盖安装点,这样你最终可能会期望一个供应商文件夹而不是它 .
理想情况下应该将它作为
ENTRYPOINT
,这个在容器启动的最后一步发生 .这是一个小小的开发比较:一个docker镜像是一个docker容器,类是一个类的实例 - 一个对象 .
您的容器都是根据可能很久以前构建的图像创建的 .
Dockerfile
中的大多数步骤都是在创建映像时发生的,而不是在容器引导时发生的 .虽然docker-compose的大部分指令都是针对容器构建的自动化,包括文件夹的安装 .