在重build容器时,Docker COPY不更新文件

我有一个docker-compose-staging.yml文件,我用它来定义一个PHP应用程序。 我已经定义了一个数据卷容器(应用程序),其中存放了我的应用程序代码,并使用volumes_from与其他容器共享。

泊坞窗 – 撰写-staging.yml:

version: '2' services: nginx: build: context: ./ dockerfile: docker/staging/nginx/Dockerfile ports: - 80:80 links: - php volumes_from: - app php: build: context: ./ dockerfile: docker/staging/php/Dockerfile expose: - 9000 volumes_from: - app app: build: context: ./ dockerfile: docker/staging/app/Dockerfile volumes: - /var/www/html entrypoint: /bin/bash 

这个特定的docker-compose-staging.yml用于将应用程序部署到云提供程序(DigitalOcean),而应用程序容器的Dockerfile具有COPY命令,该命令将文件夹从本地目录复制到configuration中定义的卷。

泊坞窗/分期/应用/ Dockerfile:

 FROM php:7.1-fpm COPY ./public /var/www/html/public COPY ./code /var/www/html/code 

这在我第一次构build和部署应用程序时起作用。 我的公共代码和代码目录中的代码在远程服务器上存在且正确。 我使用以下命令进行部署:

 docker-compose -f docker-compose-staging.yml up -d 

然而,接下来我尝试添加一个文件到我的本地公共目录,然后运行以下命令来重build更新后的代码:

 docker-compose -f docker-compose-staging.yml build app 

这个重build的输出表明COPY命令是成功的:

 Building app Step 1 : FROM php:7.1-fpm ---> 6ed35665f88f Step 2 : COPY ./public /var/www/html/public ---> 4df40d48e6a5 Removing intermediate container 7c0fbbb7f8b6 Step 3 : COPY ./code /var/www/html/code ---> 643d8745a479 Removing intermediate container cfb4f1a4f208 Successfully built 643d8745a479 

然后我使用:

 docker-compose -f docker-compose-staging.yml up -d 

有了以下输出:

 Recreating docker_app_1 Recreating docker_php_1 Recreating docker_nginx_1 

但是,当我login到远程容器时,文件更改不存在。

我对Docker比较陌生,所以我不确定是否误解了这个过程的任何部分! 任何指导将不胜感激。

您正试图用新映像中的内容更新现有卷,这是行不通的。

https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes

状态:

Changes to a data volume will not be included when you update an image.

这是因为caching。

跑,

 docker-compose build --no-cache 

这将重build图像,而不使用任何caching。

接着,

 docker-compose -f docker-compose-staging.yml up -d 

我不确定它是否caching,因为(a)通常在构build输出中指出是否使用caching,(b)“构build”应该感知目录中已更改的内容并使caching无效。

我会尝试调出用于构build它的同一台机器上的容器,以查看是否更新了该容器。 如果是,则更改的图像不会传播。 我没有看到在你的文件中使用的任何版本(build -t XXXX:0.1或build -t XXXX:latest),所以可能是你的登台机器使用了一个陈旧的图像。 或者,你是否推新图像,以便登台服务器将它从某个地方拉出来?

在dotnet核心应用上工作的时候我也有类似的问题。

我试图做的是重build我的应用程序,并得到它更新我的docker图像,以便我可以看到我的变化反映在集装箱的副本。

所以我通过使用命令去除由docker-compose生成的底层映像来得到我的更改反映:

 docker rmi *[imageId]* 

我相信在docker-compose中应该有这个支持,但是现在这足以满足我的需要了。