首页 文章

如何运行composer从php容器中的dockerfile安装

提问于
浏览
0

美好的一天,我有一个在Dockerfile中设置的php容器

我正在尝试使用此命令运行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"]

但我没有得到错误,并且因为作曲家安装没有工作而无法运行应用程序 . 只是laravel的白色屏幕,这意味着没有安装作曲家 .

如果我在docker compose之后运行

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

我收到错误Composer在/ app中找不到composer.json文件要初始化项目,请创建一个composer.json文件,如https://getcomposer.org/ "Getting Started"部分所述

如果我试图COPY项目目录,我收到一个错误

COPY /var/www/docker/project /app

错误:服务'php'无法构建:COPY失败:stat / var / lib / docker / tmp / docker-builder091462376 / var / www / docker / project:没有这样的文件或目录虽然我在docker中有php容器中的卷-compose.yml

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

这是我的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}'

这里完全是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"]

1 回答

  • 0

    看来你正在混合PHP-FPM和一个独立的PHP服务器 . 而是将 artisan serve 移动到CMD . 此外,您只能有一个 CMD ,这是容器启动时需要执行的命令 . 要在构建容器时执行其他命令,需要使用 RUN 命令 . 所以你的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"
    

相关问题