我正在寻找一个更好的解决方案来安装composer或npm包到通过docker compose挂载的主机卷内。
在docker-compose.yml中,我有:
volumes:
- ./app:/var/www/app
...
在我的Dockerfile中,我想使用这个卷来安装:
VOLUME ["/var/www/app"]
RUN composer install -d /var/www/app
但据我所知,当容器从dockerfile构建时,docker compose中装载的卷尚不可用。
所以我下一次尝试是在容器启动时:
CMD bash -c "composer install -d /var/www/app && /usr/sbin/apache2ctl -DFOREGROUND"
这至少起到了作用,但它每次运行容器时都调用composer install,这是多余的。
因此,我目前的想法是使用一个专用的composer映像,将composer.json装入其中进行安装,然后将完成的供应商从composer容器复制到容器中的某个位置并链接到需要的位置这样地:
FROM composer as composer
COPY ./app/composer.json /app
COPY ./app/composer.lock /app
RUN composer install --ignore-platform-reqs --no-scripts
FROM library/ubuntu:jessie
# ... do other stuff with the main image ...
COPY --from=composer /app/vendor /var/www/composer/vendor
CMD bash -c "ln -s /var/www/composer/vendor /var/www/app/vendor && /usr/sbin/apache2ctl -DFOREGROUND"
但对于这样一个普通的问题来说,这仍然是一种权宜之计。有没有更好的方法来解决这个问题或任何已知的良好实践?