简体   繁体   中英

How To Install PHP Composer via Docker And Use As If It Was Installed Locally?

I'm trying to install PHP Composer via Docker to be able to run composer as if it was installed on my host (MacOS) locally.

FROM php:7.2.13-apache

# install supporting packages
RUN apt-get update && apt-get install -y --fix-missing \
    xz-utils \
    build-essential \
    pkg-config \
    git-core \
    autoconf \
    libjpeg62-turbo-dev \
    libsodium-dev \
    libpng-dev \
    libcurl4-openssl-dev \
    libpq-dev \
    libpspell-dev \
    libsqlite3-dev \
    libmagickwand-dev \
    libzip-dev \
    imagemagick \
    subversion \
    python \
    g++ \
    curl \
    vim \
    wget \
    netcat \
    chrpath

# install officially supported php extensions
RUN docker-php-ext-install \
    iconv \
    sodium \
    opcache \
    curl \
    gd \
    mysqli \
    exif \
    mbstring \
    pdo \
    pdo_pgsql \
    pdo_mysql \
    pdo_sqlite \
    pspell \
    pgsql \
    soap \
    zip \
    && docker-php-ext-configure zip --with-libzip \
    && docker-php-ext-install zip

# PECL modules
RUN pecl install imagick \
    && pecl install xdebug-2.6.0

COPY ./xdebug/xdebug.ini /usr/local/etc/php/conf.d/ 

# Enable PECL modules
RUN docker-php-ext-enable imagick xdebug

# cleanup apt
RUN apt-get clean
RUN apt-get autoremove -y

# enable apache modules
RUN a2enmod rewrite headers cache cache_disk expires vhost_alias userdir autoindex
RUN service apache2 restart
RUN service apache-htcacheclean start

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
RUN chown -R www-data:www-data /var/www

RUN echo "memory_limit=-1" > "$PHP_INI_DIR/conf.d/memory-limit.ini" \
 && echo "date.timezone=${PHP_TIMEZONE:-UTC}" > "$PHP_INI_DIR/conf.d/date_timezone.ini"

RUN apk add --no-cache --virtual .build-deps zlib-dev libzip-dev \
 && docker-php-ext-configure zip --with-libzip \
 && docker-php-ext-install zip \
 && runDeps="$( \
    scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
    | tr ',' '\n' \
    | sort -u \
    | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )" \
 && apk add --virtual .composer-phpext-rundeps $runDeps \
 && apk del .build-deps

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /tmp
ENV COMPOSER_VERSION 1.8.0

RUN curl --silent --fail --location --retry 3 --output /tmp/installer.php --url https://raw.githubusercontent.com/composer/getcomposer.org/b107d959a5924af895807021fcef4ffec5a76aa9/web/installer \
 && php -r " \
    \$signature = '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061'; \
    \$hash = hash('SHA384', file_get_contents('/tmp/installer.php')); \
    if (!hash_equals(\$signature, \$hash)) { \
        unlink('/tmp/installer.php'); \
        echo 'Integrity check failed, installer is either corrupt or worse.' . PHP_EOL; \
        exit(1); \
    }" \
 && php /tmp/installer.php --no-ansi --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} \
 && composer --ansi --version --no-interaction \
 && rm -rf /tmp/* /tmp/.htaccess

RUN chmod 700 /usr/bin/composer

COPY docker-entrypoint.sh /docker-entrypoint.sh

WORKDIR /var/www

CMD ["apache2-foreground"]

EXPOSE 80

docker-entrypoint.sh has the following code ( from official composer docker page ):

#!/usr/bin/env bash

isCommand() {
  for cmd in \
    "about" \
    "archive" \
    "browse" \
    "check-platform-reqs" \
    "clear-cache" \
    "clearcache" \
    "config" \
    "create-project" \
    "depends" \
    "diagnose" \
    "dump-autoload" \
    "dumpautoload" \
    "exec" \
    "global" \
    "help" \
    "home" \
    "info" \
    "init" \
    "install" \
    "licenses" \
    "list" \
    "outdated" \
    "prohibits" \
    "remove" \
    "require" \
    "run-script" \
    "search" \
    "self-update" \
    "selfupdate" \
    "show" \
    "status" \
    "suggests" \
    "update" \
    "upgrade" \
    "validate" \
    "why" \
    "why-not"
  do
    if [ -z "${cmd#"$1"}" ]; then
      return 0
    fi
  done

  return 1
}

# check if the first argument passed in looks like a flag
if [ "$(printf %c "$1")" = '-' ]; then
  set -- /sbin/tini -- composer "$@"
# check if the first argument passed in is composer
elif [ "$1" = 'composer' ]; then
  set -- /sbin/tini -- "$@"
# check if the first argument passed in matches a known command
elif isCommand "$1"; then
  set -- /sbin/tini -- composer "$@"
fi

exec "$@"

docker-compose.yml has the following code:

version: '3'
services:

    php:
       container_name: local_php
       build: .
       image: php:7.2.13-apache
       ports:
         - "80:80"
         - "443:443"
         - "9001:9001"
       volumes:
         - ../:/var/www/html/

I expect to be able to run composer commands from the terminal (eg composer install ) but I get the error -bash: composer: command not found each time I try to run any composer command after doing a Dockerfile build.

I finally figured it out; in case someone's trying to achieve the same you got two options basically:

  1. Access php container bash (by using docker exec -it <container name> /bin/bash and navigate to the folder you wish to use composer on, and run composer commands. It might also be helpful to note that docker-compose run <container name> ls would show container's mounted volumes (if you wish to check / make sure).
  2. Run the following commands in macos terminal, to be able to use composer as if it was installed locally:
#!/bin/bash
mkdir ~/.functions
echo '#!/bin/bash
tty=
tty -s && tty=--tty
docker run \
    $tty \
    --interactive \
    --rm \
    --user $(id -u):$(id -g) \
    --workdir /var/www/html/${PWD##*/} \
    --volume /etc/passwd:/etc/passwd:ro \
    --volume /etc/group:/etc/group:ro \
    --volume $(pwd):/var/www/html/${PWD##*/} \
    composer "$@"' > ~/.functions/composer
echo 'alias composer="sh ~/.functions/composer"' >> ~/.bash_profile
source ~/.bash_profile

Then in terminal try composer version to see if it's working; if not, try executing source ~/.bash_profile once more, and re-try.

Hope that helps!

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