重建后文件更改未反映在Docker镜像中

时间:2016-06-13 02:40:40

标签: php nginx docker docker-compose docker-volume

我试图为我的PHP Web应用程序(php-fcm)设置两个Docker镜像,由NGINX反向代理。理想情况下,我希望将Web应用程序的所有文件复制到基于php-fcm的映像中并作为卷公开。这样,两个容器(web和app)都可以使用NGINX服务静态文件和php-fcm解释php文件来访问文件。

搬运工-compose.yml

version: '2'
services:
  web:
    image: nginx:latest
    depends_on:
      - app
    volumes:
      - ./site.conf:/etc/nginx/conf.d/default.conf
    volumes_from:
      - app
    links:
      - app
  app:
    build: .
    volumes:
      - /app

Dockerfile:

FROM php:fpm
COPY . /app
WORKDIR /app

以上设置按预期工作。但是,当我对文件进行任何更改然后执行

compose up --build

未在生成的图像中拾取新文件。尽管有以下消息表明图像确实正在重建:

Building app
Step 1 : FROM php:fpm
 ---> cb4faea80358
Step 2 : COPY . /app
 ---> Using cache
 ---> 660ab4731bec
Step 3 : WORKDIR /app
 ---> Using cache
 ---> d5b2e4fa97f2
Successfully built d5b2e4fa97f2

只删除所有旧图像就可以了。

知道可能导致这种情况的原因吗?

$ docker --version
Docker version 1.11.2, build b9f10c9
$ docker-compose --version
docker-compose version 1.7.1, build 0a9ab35

2 个答案:

答案 0 :(得分:1)

'volumes_from'选项将卷从一个容器挂载到另一个容器。重要的一个词是容器,而不是图像。因此,当您重建图像时,前一个容器仍在运行。如果停止并重新启动该容器,或者甚至只是停止它,则其他容器仍在使用那些旧的挂载点。如果您停止,删除旧的应用程序容器,并启动一个新容器,旧的卷安装仍将保留到现在已删除的容器。

在您的情况下解决此问题的更好方法是切换到命名卷并设置实用程序容器以更新此卷。

docker run --rm -it \
  -v `pwd`/new-app:/source -v app-data:/target \
   busybox /bin/sh -c "tar -cC /source . | tar -xC /target"

用于更新应用数据量的实用程序容器可能如下所示:

futureInvestment = investmentAmount * (1 + monthlyInterestRate)^numberOfYears*12

答案 1 :(得分:1)

正如BMitch指出的那样,图像更新不会自动过滤到容器中。您需要重新审视您的更新工作流程。我刚刚完成了构建包含NGINX和PHP-FPM的容器的过程。我发现,对我来说,最好的方法是将nginx和php包含在一个容器中,这两个容器都由supervisord管理。 然后我在图像中有脚本,允许您从git仓库更新代码。这使整个过程变得非常简单。

#Create new container from image
docker run -d --name=your_website -p 80:80 -p 443:443 camw/centos-nginx-php
#git clone to get website code from git
docker exec -ti your_website get https://www.github.com/user/your_repo.git
#restart container so that nginx config changes take effect
docker restart your_website

#Then to update, after committing changes to git, you'll call
docker exec -ti your_website update
#restart container if there are nginx config changes
docker restart your_website

我的容器可以在https://hub.docker.com/r/camw/centos-nginx-php/找到 dockerfile和关联的构建文件位于https://github.com/CamW/centos-nginx-php

如果您想尝试一下,只需fork https://github.com/CamW/centos-nginx-php-demo,请按照自述文件中的说明更改conf / nginx.conf文件并包含您的代码。

这样做,你根本不需要处理卷,一切都在我喜欢的容器中。