如何通过Docker安装PHP Composer并像在本地安装一样使用



我正在尝试通过Docker安装PHP Composer,以便能够运行composer,就好像它在本地安装在我的主机(MacOS)上一样。

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有以下代码(来自官方作曲家Docker页面):

#!/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具有以下代码:

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/

我希望能够从终端运行作曲家命令(例如 composer install ),但是每次在执行 Dockerfile 构建后尝试运行任何作曲家命令时,我都会-bash: composer: command not found收到错误。

我终于想通了;如果有人试图实现相同的目标,你基本上有两个选择:

  1. 访问 php 容器 bash(通过使用 docker exec -it <container name> /bin/bash并导航到您希望在其上使用作曲家的文件夹,然后运行作曲家命令。注意docker-compose run <container name> ls将显示容器的挂载卷(如果您希望检查/确保)也可能有所帮助。
  2. 在 macos 终端中运行以下命令,以便能够像在本地安装一样使用 composer:
#!/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

然后在终端中尝试composer version以查看它是否正常工作;如果没有,请尝试再次执行source ~/.bash_profile,然后重试。

希望对您有所帮助!

相关内容

最新更新