获取要在 docker 映像构建上运行的 composer(php 依赖项管理器)

TL;DR你能给我指出一个使用 composer 来处理 PHP 依赖项的 docker 映像的例子吗?


我在这篇文章中的所有问题都是关于作曲家的php依赖工具,而不是docker-composerfig的继任者。

我正在尝试构建自己的docker映像来运行作为作曲家依赖项安装的WordPress

我正在使用docker PHP映像作为基础构建docker映像,我需要做的是安装composer并在映像创建时或映像构建时运行composer更新命令(不知道两者是否可以)。

我可以通过手动执行所有步骤(运行docker映像,抨击它以及复制和粘贴每个步骤)来运行所有内容。

但是,当我把所有这些步骤放在Dockerfile上时,我不会让作曲家来编写文件。

一段时间以来,我一直试图获得一个最小的失败示例,但我得到的那个并不是最小值。

我的测试由以下内容组成(链接到下面的相关github存储库)

Dockerfile

NFORMATION ~~~#

# based on
# https://hub.docker.com/r/richarvey/nginx-php-fpm/
# and
# https://hub.docker.com/_/wordpress/

FROM php:7.0.2-apache

MAINTAINER Miquel Adell <miquel@miqueladell.com>

ENV WORDPRESS_VERSION 4.4.1



#~~~ DEPENDENCIES ~~~#

# Add PHP repository to apt source
RUN apt-get update \
    && apt-get install -y \
        libpng12-dev \
        libjpeg-dev  \
        curl \
        sed \
        zlib1g-dev \
    && docker-php-ext-install \
        zip \
        mysqli

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



#~~~ DIRS ~~~#

WORKDIR /var/www/html/



#~~~ WORDPRESS ~~~#

COPY files/composer.json composer.json
ONBUILD RUN composer update

docker-compose.yml

wordpress:
  image: miqueladell/composed_wordpress_test
  links:
    - wordpress_db:mysql
  environment:
    - VIRTUAL_HOST=miqueladell.dev
    - WORDPRESS_DB_NAME=wordpress
  ports:
   - "80"

wordpress_db:
  image: miqueladell/mariadb-utf8mb4
  environment:
     - MYSQL_ROOT_PASSWORD=password

我的测试如下

  1. 在包含上面粘贴的 Dockerfile 的目录中构建执行此命令的映像

     docker build -t miqueladell/composed_wordpress_test .
    

    (日志中没有错误)

  2. 通过在包含上面粘贴的 docker-compose.yml 的目录中运行以下命令,使用该映像构建容器

     docker-compose up
    

    (日志中没有错误)

  3. bash 到正在运行的容器中,以便能够查看文件是否存在

     docker exec -i -t miqueladellv2_wordpress_1 bash
    
  4. ls of /var/www/html

     root@bff14367658b:/var/www/html# ls -al
     total 12
     drwxr-xr-x 2 www-data www-data 4096 Jan 19 10:50 .
     drwxr-xr-x 5 root     root     4096 Jan 19 10:50 ..
     -rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
    

您可以在步骤 4 中看到,作曲家更新似乎根本没有运行。

我尝试同时使用两者

RUN composer update

ONBUILD RUN composer update

在 Dockerfile 上具有相同的结果。

如果我回到测试的上一步4,并在docker容器的bash提示符下手动运行作曲家更新,我会得到:

root@bff14367658b:/var/www/html# composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing johnpbloch/wordpress-core-installer (0.2.1)
    Downloading: 100%

  - Installing johnpbloch/wordpress (4.4.1)
    Downloading: 100%

Writing lock file
Generating autoload files
root@bff14367658b:/var/www/html# ls -al
total 24
drwxr-xr-x 4 www-data www-data 4096 Jan 19 11:12 .
drwxr-xr-x 6 root     root     4096 Jan 19 11:12 ..
-rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
-rw-r--r-- 1 root     root     3718 Jan 19 11:12 composer.lock
drwxr-xr-x 4 root     root     4096 Jan 19 11:12 vendor
drwxr-xr-x 5 root     root     4096 Jan 19 11:12 wordpress
root@bff14367658b:/var/www/html#

这正是我在步骤4中期望的输出

github 链接到完整文件


答案 1

像这样安装 Composer 将避免此问题:

RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
# Make sure we're installing what we think we're installing!
&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \
&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot \
&& rm -f /tmp/composer-setup.*

答案 2

我今天遇到了这个问题。

对我来说,解决它的方法是使用与图像中定义的目录不同的目录。

如果将目录定义为卷,则似乎在构建过程中对目录所做的更改将被丢弃。

这是我的工作 Dockerfile 的一个示例

FROM richarvey/nginx-php-fpm

# Install dependencies
RUN apt-get update && \
    apt-get install curl nano && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add update nginx config
COPY conf/nginx-site.conf /etc/nginx/sites-available/default.conf

# Bundle app source 
COPY app/ /app

# Install app dependencies
RUN cd /app && \
    composer install --no-interaction 

EXPOSE 80

然后在我更新了我的应用程序的根目录(为简洁起见而缩短)conf/nginx-site.conf

server {
    # ... the rest of your nginx config

    root /app/public;

    # ... the rest of your nginx config
}

推荐