简体   繁体   English

如何在 php 容器中从 dockerfile 运行 composer install

[英]How run composer install from dockerfile in php container

Good day I have php container which seting up in Dockerfile美好的一天,我在 Dockerfile 中设置了 php 容器

I am trying to run composer install with this command我正在尝试使用此命令运行 composer install

WORKDIR '/app'
RUN curl -sS https://getcomposer.org/installer | \
            php -- --install-dir=/usr/bin/ --filename=composer
        CMD bash -c "composer install && php artisan serve --host 0.0.0.0 --port 80"
    EXPOSE 80
    EXPOSE 22
    CMD ["php-fpm"]

But I didnt get the error, and can not run application because of the composer install didnt worked.Just white screen of laravel which mean composer was not installed.但是我没有收到错误消息,并且由于 composer install 没有工作而无法运行应用程序。只有 laravel 的白屏,这意味着没有安装 composer。

If I run after docker compose up如果我在 docker compose up 之后运行

docker run -it --rm -v $(pwd):/app composer/composer install

I receive an error Composer could not find a composer.json file in /app To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section我收到一个错误 Composer 在 /app 中找不到 composer.json 文件要初始化一个项目,请按照https://getcomposer.org/ “入门”部分中的描述创建一个 composer.json 文件

If I trying to COPY project dirrectory I receive an error如果我尝试复制项目目录,我会收到一个错误

COPY /var/www/docker/project /app

ERROR: Service 'php' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder091462376/var/www/docker/project: no such file or directory While I have the volumes in php container in docker-compose.yml错误:服务 'php' 无法构建:复制失败:stat /var/lib/docker/tmp/docker-builder091462376/var/www/docker/project:没有这样的文件或目录虽然我在 docker 中的 php 容器中有卷-compose.yml

volumes:
            - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}
            - /app/vendor/

Here is my docker-compose.yml这是我的 docker-compose.yml

version: '2'
services:
    nginx:
     image: nginx:latest
     container_name: "${PROJECT_NAME}_nginx"
     environment:
       NGINX_STATIC_OPEN_FILE_CACHE: "off"
       NGINX_ERROR_LOG_LEVEL: debug
       NGINX_BACKEND_HOST: php
       NGINX_VHOST_PRESET: php
       NGINX_SERVER_ROOT: /app/public
     ports:
        - "80:80"
        - "443:443"
     volumes:
        - ./hosts:/etc/nginx/conf.d
        - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}
        - ./logs:/var/log/nginx
     links:
        - php

     labels:
       - 'traefik.backend=nginx'
       - 'traefik.port=80'
       - 'traefik.frontend.rule=Host:${PROJECT_BASE_URL}'  
    php:
        build: ./images/php
        links:
            - mariadb
        #command: bash -c 'cd /app composer install'    
        volumes:
            - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}
            - /app/vendor/

    mariadb:
     image: wodby/mariadb:$MARIADB_TAG
     container_name: "${PROJECT_NAME}_mariadb"
     stop_grace_period: 30s
     environment:
      MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
      MYSQL_DATABASE: $DB_NAME
      MYSQL_USER: $DB_USER
      MYSQL_PASSWORD: $DB_PASSWORD

    pma:
     image: phpmyadmin/phpmyadmin
     container_name: "${PROJECT_NAME}_pma"
     ports:
        - "9000:80"
     environment:
       PMA_HOST: $DB_HOST
       PMA_USER: $DB_USER
       PMA_PASSWORD: $DB_PASSWORD
       PHP_UPLOAD_MAX_FILESIZE: 1G
       PHP_MAX_INPUT_VARS: 1G
     labels:
      - 'traefik.backend=pma'
      - 'traefik.port=80'
      - 'traefik.frontend.rule=Host:pma.${PROJECT_BASE_URL}'

Here is completely Dockerfile这里完全是Dockerfile

FROM php:7.2-fpm-alpine3.6
WORKDIR '/app'
RUN apk update && apk upgrade\
    && apk add --no-cache curl libbz2 php7-bz2 php7-pdo php7-pgsql php7-bcmath php7-zmq php7-curl bash php7-pear php7-imagick openssh imap-dev\
    libtool \
    postgresql-dev \
    libpng-dev \
    imagemagick-c++ \
    imagemagick-dev \
    libmcrypt-dev \
    libxml2-dev \
    yaml-dev \
    bzip2 \
    aspell-dev \
    autoconf \
    build-base \
    linux-headers \
    libaio-dev \
    zlib-dev \
    git \
    subversion \
    freetype-dev \
    libjpeg-turbo-dev \
    libmcrypt-dev \
    bzip2-dev \
    libstdc++ \
    libxslt-dev \
    openldap-dev \
    hiredis-dev \
    make \
    unzip \
    ffmpeg \
    wget
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-configure imap --with-imap --with-imap-ssl \
  && docker-php-ext-install -j 4 imap 


RUN docker-php-ext-install gd bcmath zip bz2 pdo pdo_mysql simplexml opcache sockets mbstring pcntl xsl pspell
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
RUN pecl install imagick
RUN docker-php-ext-enable imagick 
RUN pecl install xdebug
RUN wget http://xdebug.org/files/xdebug-2.6.1.tgz
RUN tar -xvzf xdebug-2.6.1.tgz
RUN cd xdebug-2.6.1 \
    && phpize \
    && ./configure --enable-xdebug \
    && make \
    && make install \
    && cp modules/xdebug.so /usr/local/lib/php/extensions/no-debug-non-zts-20170718 \
    && echo 'zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so' >> /usr/local/etc/php/php.ini \
    && echo 'zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so' >> /etc/php7/php.ini \
    && echo 'xdebug.remote_enable=true' >> /etc/php7/php.ini \
    && echo 'xdebug.remote_host=127.0.0.1' >> /etc/php7/php.ini \
    && echo 'xdebug.remote_port=9000' >> /etc/php7/php.ini \
    && echo 'xdebug.remote_handler=dbgp' >> /etc/php7/php.ini \
    && echo 'xdebug.max_nesting_level=512' >> /etc/php7/php.ini

ENV COMPOSER_ALLOW_SUPERUSER 1

RUN echo "Install ZeroMQ library and PHP extension"
RUN apk add --update autoconf gcc libzmq zeromq-dev zeromq coreutils build-base
RUN pecl install zmq-beta \
  && docker-php-ext-enable zmq
#COPY ./project /app
RUN curl -sS https://getcomposer.org/installer | \
    php -- --install-dir=/usr/bin/ --filename=composer
#RUN "composer install"


EXPOSE 80

EXPOSE 22
#CMD php artisan serve --host=0.0.0.0 --port=80
#CMD php artisan migrate --seed

CMD ["php-fpm"]
USER root
copy run.sh /run.sh
RUN chmod +x /run.sh  
RUN ls
#RUN ["chmod", "+x", "/run.sh"]
COPY ./././project app/
RUN composer install --no-dev --no-interaction -o

CMD ["/run.sh"]

It seems you are mixing PHP-FPM and a standalone PHP server.看来您正在混合使用 PHP-FPM 和独立的 PHP 服务器。 Rather move the artisan serve to the CMD.而是将artisan serve转移到 CMD。 Also, you can only have one CMD , which is the command that needs to execute when the container starts.另外,你只能有一个CMD ,它是容器启动时需要执行的命令。 In order to execute other commands when building the container, you need to use the RUN command.为了在构建容器时执行其他命令,需要使用RUN命令。 So your Dockerfile can look like this:所以你的 Dockerfile 可以是这样的:

WORKDIR '/app'
RUN curl -sS https://getcomposer.org/installer | \
            php -- --install-dir=/usr/bin/ --filename=composer

RUN "composer install"
EXPOSE 80
EXPOSE 22
CMD "php artisan serve --host 0.0.0.0 --port 80"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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