让composer(php依赖管理器)在docker镜像构建上运行

Get composer (php dependency manager) to run on a docker image build

注意:我不再使用此环境,因此无法测试答案并接受答案。我很抱歉。

TL;DR Can you point me to an example of a docker image that uses composer to handle PHP dependencies?

All my questions in this post are regarding composer the php dependency tool not docker-composer the successor of fig.

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

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

我可以通过手动执行所有步骤(运行Docker映像、猛击它、复制和粘贴每个步骤)来运行一切。

但当我把所有的步骤放在一个dockerfile上时,我没有让composer来写这些文件。

一段时间以来,我一直在试图找到一个最小失败的例子,但我得到的例子并不是mininum。

我的测试由以下部分组成(链接到下面相关的Github Repo)

文档文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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



#~~~&nbsp;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公司

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

我的测试如下

  • 在包含粘贴在上面的dockerfile的目录中生成执行此命令的映像

    1
    docker build -t miqueladell/composed_wordpress_test .

    (日志中没有错误)

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

    1
    docker-compose up

    (日志中没有错误)

  • 猛击正在运行的容器以查看文件是否存在

    1
    docker exec -i -t miqueladellv2_wordpress_1 bash
  • ls/var/www/html

    1
    2
    3
    4
    5
    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中看到,编写器更新似乎根本没有运行。

    我试过两者都用

    1
    RUN composer update

    1
    ONBUILD RUN composer update

    在具有相同结果的Dockerfile上。

    如果我回到测试的前一步4,并在Docker容器的bash提示符上手动运行composer update,我会得到:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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#

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

    我想要一些建议。谢谢。

    GitHub链接到完整文件

    • Dockerfile及其依赖项
    • 码头工人作曲家


    这样安装作曲家可以避免此问题:

    1
    2
    3
    4
    5
    6
    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.*


    我今天碰到这个问题了。

    解决这个问题的方法是使用一个不同于映像中定义的目录。

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

    这是我工作文件的一个例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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中,我更新了应用程序的根目录(简称为简洁)。

    1
    2
    3
    4
    5
    6
    7
    server {
        # ... the rest of your nginx config

        root /app/public;

        # ... the rest of your nginx config
    }