0

I want to copy the vendor folder from the composer image to another php image during a multistaged build.

My Dockerfile looks like this:

FROM composer
WORKDIR /tmp/composer-vendors/
COPY composer.lock composer.json ./
RUN composer install --ignore-platform-reqs
RUN pwd && ls

FROM php:7.3-fpm-alpine
WORKDIR /var/www/html
RUN pwd && ls
COPY --from=composer /tmp/composer-vendors/vendor ./vendor
CMD ["php-fpm"]

The RUN pwd && ls is only there to show that the files are indeed there.

Yet the copy --from=composer fails stating:

Step 9/10 : COPY --from=composer /tmp/composer-vendors/vendor ./vendor
COPY failed: stat /var/lib/docker/overlay2/c0cece8b4ffcc3ef3f6ed26c3131ae94813acffd5034b359c2ea6aed922f56ee/merged/tmp/composer-vendors/vendor: no such file or directory

What am I doing wrong?


My example composer.json:

{
  "name": "kopernikus/multistage-copy-issue",
  "require": {
    "nesbot/carbon": "^2.36"
  }
}
k0pernikus
  • 60,309
  • 67
  • 216
  • 347

1 Answers1

0

You have to alias the image as otherwise docker uses the base image as provided by composer and not the image you built.

This means you need to change your FROM statement:

FROM composer as BUILDER

and reference your image:

COPY --from=BUILDER /tmp/composer-vendors/vendor ./vendor

The alias could be anything, I used BUILDER as an example. In fact, you could even reuse the name:

FROM composer AS composer

though that might lead to unexpected behavior if people are not expecting a modified image.

k0pernikus
  • 60,309
  • 67
  • 216
  • 347