docker-compose覆盖容器中的目录

时间:2019-06-20 16:32:21

标签: php docker docker-compose composer-php dockerfile

上下文

我最近设置了一个PHP应用程序,以在连接到其他容器中的数据库的docker容器中工作。

在生产中,我们使用的是单个容器环境,因为它只是连接到托管在其他位置的数据库。尽管如此,我们还是决定在本地使用两个容器和docker-compose,以简化开发工作流程。

问题

我们遇到的问题是,即使我们有一个特定的{{1},我们第一次也无法通过docker-compose up --build Composer的vendor目录构建和运行该应用程序RUN composer install中的}}行。一旦容器运行,我们就必须在容器中执行Dockerfile

找到解决方法

经过大量的搜索,我们发现我们有两种可能的解决方案:

  1. 将Docker映像的默认命令更改为以下命令:
composer install
  1. 或者通过docker-compose的command简单地将容器的默认命令覆盖到上面。

区别在于,如果我们通过docker-compose覆盖命令,则在将应用程序部署到我们的服务器时,它会像应有的那样无缝运行,但是在bash -c "composer install && /usr/sbin/apache2ctl -D FOREGROUND" 中更改默认命令时,它将受到影响每次部署时,停机时间都只有1分钟。

在此过程中这有所帮助:

  1. Running composer install within a Dockerfile

一些(也许是错误的)结论

我的结论是,那一分钟的停机时间是由于容器必须在运行Apache服务器之前(而不是简单地运行服务器)通过composer安装所有依赖项。

此外,我从所有讨论中得出的另一个结论是,Dockerfile不会安装作曲家依赖项的原因是因为我们在docker-compose up --build中指定了一个覆盖目录的卷在容器中。

这些帮助:

  1. https://stackoverflow.com/a/38817651/4700998

  2. https://stackoverflow.com/a/48589910/4700998

实际问题

我希望有人能对此有所了解,因为我并不真正了解发生了什么-为什么运行docker-compose不会安装PHP依赖项,而是在默认情况下包含docker-compose.yml该命令将以及为什么将composer install添加到composer install会更好。此外,交易量是如何进入这一切的,这是造成所有麻烦的真正原因。

我们当前的docker文件如下:

docker-compose.yml

我们当前的FROM php:7.1.27-apache-stretch ENV DEBIAN_FRONTEND=noninteractive # install some stuff, PHP, Apache, etc. WORKDIR /srv/app COPY . . RUN composer install RUN service apache2 restart EXPOSE 80 CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] 如下:

docker-compose.yml

1 个答案:

答案 0 :(得分:1)

您在composer install中的第一个Dockerfile工作正常,并且您生成的图像带有vendor/等。

但是稍后您从该映像创建一个容器,然后执行该容器,并且整个目录都将替换为主机目录装载:

volumes:
      - .:/srv/app

因此,您的docker映像同时包含了文件和已安装的供应商文件,但是随后您将项目目录替换为主机上没有供应商文件的目录,最终结果似乎从未完成构建。

我的建议是:

  • 不要将第二个命令版本添加到Dockerfile
  • 将单个文件夹装入容器中,即不是.:/srv/app,而是./src:/srv/app/src等。
  • 或映射整个文件夹,但将供应商文件从映像/容器复制到您的主机
  • 或使用某些第三方工具来解决此问题,例如http://docker-sync.io或许多其他