(Docker)如何在 WordPress 容器中使用单独的 Composer 容器安装依赖项?

Posted

技术标签:

【中文标题】(Docker)如何在 WordPress 容器中使用单独的 Composer 容器安装依赖项?【英文标题】:(Docker) How to install dependencies, using separate Composer container, in WordPress container? 【发布时间】:2016-03-16 17:07:21 【问题描述】:

Dockerfile

FROM wordpress

ENV REFRESHED_AT 2015-08-12

ADD \
  composer.json /var/www/html
ADD \
  composer.lock /var/www/html

# install the php extensions
RUN \
  apt-get -qq update && \
  apt-get -y upgrade && \
  apt-get install -y vim wget && \
  rm -rf /var/lib/apt/lists/*

# Symlink User's "wp-content" folder into the newly installed Wordpress
RUN \
  rm -rf /usr/src/wordpress/wp-content/plugins/* && \
  rm -rf /usr/src/wordpress/wp-content/themes/* && \
  cp -fr /usr/src/wordpress/* /var/www/html/ && \
  chown -R www-data:www-data /var/www/html/

# volume for mysql database and wordpress install
VOLUME ["/var/www/html/wp-content/plugins", "/var/www/html/wp-content/themes"]

# Define working directory.
WORKDIR /var/www/html/

EXPOSE 80 3306

CMD ["apache2-foreground"]

Docker 编写文件

wordpress:
  build: .
  links:
    - mysql
    - composer
  volumes:
    - wp-content/plugins/:/var/www/html/wp-content/plugins
    - wp-content/themes/:/var/www/html/wp-content/themes
  environment:
    - WORDPRESS_DB_PASSWORD=__WORDPRESS_DB_PASSWORD__
    - WORDPRESS_DB_NAME=__WORDPRESS_DB_NAME__
    # - WORDPRESS_DB_USER=__WORDPRESS_DB_USER__

  ports:
    - "9888:80"

mysql:
  image: mysql:5.7
  environment:
    - MYSQL_ROOT_PASSWORD=__WORDPRESS_DB_PASSWORD__
    - MYSQL_DATABASE=__WORDPRESS_DB_NAME__

composer:
  image: composer/composer

问题详情

我可以将ADD composer.jsoncomposer.lock 文件放到工作目录中。我可以确认这两个文件在工作目录中。

我需要的是 Dockerfile(或任何地方)也自动将依赖项安装到工作目录中。

根据 Docker Hub,https://hub.docker.com/r/composer/composer/, 我应该可以docker run -v $(pwd):/app composer/composer install 来安装依赖项,但是如何在 Dockerfile 中执行此操作?

我也很困惑,因为-v 标志https://docs.docker.com/engine/userguide/dockervolumes/ 与将指定的主机目录挂载到容器中有关,但我已经将必要的文件ADDed 到工作目录中。我要做的就是安装依赖项。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您只需在运行composer 容器时将当前目录挂载到/app。我在https://gist.github.com/andyshinn/e2c428f2cd234b718239 整理了一个简单的例子来说明这个工作。

这里的关键部分是应用程序的composer 部分的volumes 和主要PHP 应用程序上的restart: 'yes'(应用程序可能在 Composer 运行之前不会运行,因此您需要重新启动它) .

【讨论】:

非常感谢安迪!效果非常好。卷安装如何工作?当我docker run -i -t platform_wordpress /bin/bash 查看容器中的工作目录文件时,我注意到插件文件在这里不存在,但存在于我的主机(vagrant)目录中。我很难在 Docker 文档中找到答案。您是否有任何有关 Docker Compose 和 Docker 基础知识的深入答案的链接。再次感谢。 :-D 另外,我在哪里可以了解更多关于 restart 的信息。我无法在 Docker Compose 文档中找到它。您是否发现需要通过实验重新启动主应用? 我不确定您所说的“插件文件不存在”是什么意思。您可能应该为此提出另一个问题。 restart 选项位于docs.docker.com/compose/compose-file/… 的文档中。它是 Docker 运行命令的一部分:docs.docker.com/engine/reference/run/#restart-policies-restart。我认为 Docker Compose 选项“是”和“否”分别转换为“总是”和“从不”。 这似乎不会将依赖项添加到实际容器中,因此在 CI 中执行此操作并推送应用程序容器不会包含依赖项。

以上是关于(Docker)如何在 WordPress 容器中使用单独的 Composer 容器安装依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nginx-proxy 与 wordpress docker 容器一起运行 phpmyadmin?

我的 Docker Wordpress 网站在哪里存储数据?

如何通过容器服务在阿里云一分钟创建Wordpress博客

如何通过容器服务在阿里云一分钟创建Wordpress博客

docker-compose mysql 容器拒绝访问 wordpress 容器

docker使用示例