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 #~~~ 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 |
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 |
然后在
1 2 3 4 5 6 7 | server { # ... the rest of your nginx config root /app/public; # ... the rest of your nginx config } |