简体   繁体   中英

Composer install with dockerfile

I'm pretty new with docker, I try to automatically execute composer install within my Dockerfile but it seems that I can't cd into my application while installing, what's wrong? Or maybe there is another better way to do that?

my docker-compose.yml

version: "3.1"
services:

    app:
      image: nginx:alpine
      container_name: app
      working_dir: /application
      volumes:
          - ./Projects/app:/application/app
          - ./Docker/nginx/app.conf:/etc/nginx/conf.d/app.conf
      ports:
          - "8080:8080"

    php-fpm-app:
      build: Docker/php-fpm-app
      container_name: php-fpm-app
      working_dir: /application
      volumes:
          - ./Projects:/application
          - ./Docker/php-fpm-app/php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini

my Dockerfile

FROM phpdockerio/php72-fpm:latest
WORKDIR "/application"

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

RUN mkdir -p /var/www/.composer \
    && chown -R www-data:www-data /var/www/.composer

USER www-data

RUN cd /application/app; composer install

The output after I run this command:

docker-compose up -d

Step 6/6 : RUN cd /application/app; composer install
 ---> Running in ac53e653af46
/bin/sh: 1: cd: can't cd to /application/app
Composer could not find a composer.json file in /application
To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section
ERROR: Service 'php-fpm-app' failed to build: The command '/bin/sh -c cd /application/app; composer install' returned a non-zero code: 1

If I try to remove the last line from my Dockerfile, once it's up and running if I run this command:

docker-compose exec --user www-data php-fpm-app bash -c 'cd /application/app && composer install'

It works, I don't understand why I can't do this with my Dockerfile.

=========================== Finally I find a way to execute a script but I don't see the output, so if the script last for many secondes/minutes I won't know when it's done.

ADD ./setup.sh /setup.sh
RUN chmod +x /setup.sh
CMD ["sh", "/setup.sh"]

I decided to execute this script manually once all it's up and running

sh ./setup.sh

You should not run composer install in Dockerfile. It will fail because you have not created/synced volume from the local to container yet. Thus all files including composer.json is not placed under /var/www/html.

What you can do is to add 1 line (command) into your docker-compose.yaml file inside the service eg.

services:
  api-php-fpm:
    build: ./docker/php-fpm
    command: sh -c "composer install"

This is because the volumes aren't mounted until the build is complete. Just use COPY to copy only the composer.json into the folder, and run the composer install as normal.

Referencing the Documentation for Dockerfiles you need to edit your Dockerfile.

it should be:

WORKDIR /application/app
RUN composer install

Does this fix your problem?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM