【发布时间】:2019-05-28 15:25:00
【问题描述】:
我正在寻找一个更好的解决方案来在通过 docker-compose 挂载的主机卷中安装 composer 或 npm 包。
在我的 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.json 挂载到其中进行安装,然后将完成的供应商从作曲家容器的某处复制到容器中并链接到需要的地方。像这样:
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"
但是对于这样一个普通的问题,它仍然感觉有点解决方法。有没有更好的方法来解决这个问题或任何已知的良好做法?
【问题讨论】:
-
我个人更喜欢直接在主机上执行 composer 命令,或者通过 docker 通过
exec或run执行。并且仅在实际需要时才这样做。 -
我也这样做了,但是您需要使用所有工具包之类的东西来污染您的主机系统。假设您为不同的版本开发,那将是完全混乱的。如果你执行它,你必须在每次重建容器时都这样做,这也会限制自动化测试的可能性......:/
标签: docker docker-compose composer-php dockerfile