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

时间:2017-01-06 03:13:32

标签: docker docker-compose dockerfile

我有一个docker-compose-staging.yml文件,我用它来定义PHP应用程序。我已经定义了应用程序代码所在的数据卷容器(app),并使用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命令,该命令将文件夹从本地目录复制到在配置。

搬运工/分段/应用/ Dockerfile:

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

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

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

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

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

此重建的输出表明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

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

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

9 个答案:

答案 0 :(得分:11)

这是因为缓存。

运行,

docker-compose build --no-cache

这将在不使用任何缓存的情况下重建图像。

然后,

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

答案 1 :(得分:2)

在使用dotnet核心应用程序时,我遇到了类似的问题。

我尝试做的是重建我的应用程序并让它更新我的docker图像,以便我可以看到我的更改反映在容器化副本中。

所以我开始删除docker-compose up生成的底层图像,使用命令反映我的更改:

docker rmi *[imageId]*

我相信在docker-compose中应该支持这个,但这足以满足我的需求。

答案 2 :(得分:2)

我一直在为未检测到或未完成迁移而苦苦挣扎。找到这个线程并注意到根本原因确实是容器中的文件没有更新。上面建议的强制重新创建解决方案为我解决了这个问题,但我发现必须尝试记住什么时候做,什么时候不做很麻烦。例如。 Vue 相关文件似乎工作得很好,但 Django 相关文件不行。

所以我想为什么不尝试调整 Docker 文件以在复制之前清理以前的文件:

RUN rm -rf path/to/your/app
COPY . path/to/your/app

像魅力一样工作。现在它是构建的一部分,您所需要的只是再次运行 docker-compose up -d --build。文件是最新的,您可以运行 make migrations 并针对您的容器进行迁移。

答案 3 :(得分:1)

由于共享卷,我遇到了同样的问题。对我来说,解决方案是使用以下命令删除共享容器:

docker volume rm [VOLUME_ID]

您可以使用以下命令在“安装”部分中找到体积ID或名称:

docker inspect [CONTAINER_ID]

答案 4 :(得分:1)

两周后回到此页面时,只需将其留在这里。

您可能不想在此区块中使用docker system prune -f

    docker-compose down --rmi all -v \
    && docker-compose build --no-cache \
    && docker-compose -f docker-compose-staging.yml up -d --force-recreate

答案 5 :(得分:1)

我本人对Docker来说还比较陌生,尽管遇到了类似的问题,尽管关闭了缓存,但更新后的YAML文件似乎并没有复制到重建的容器中,因此发现了这个线程。

我的构建过程略有不同,因为当对master分支进行新的提交时,我使用Docker Hub的GitHub集成来自动执行图像构建。构建是在Docker的服务器上进行的,而不是在本地构建并推送的容器映像工作流。

最终对我有用的是做一个docker-compose pull,将我的.env文件中定义的容器的最新版本引入我的本地环境。不确定pull命令是否与设置了up标志的--force-recreate命令不同,但是我认为我还是愿意分享,以防它可能对某人有所帮助。

我还要注意,由于Docker构建过程实际上已检测到编辑过的文件,因此该过程使我可以重新启用自动缓存。我只是没有看到它,因为我仍然在本地过时的映像版本上运行docker-compose up

答案 6 :(得分:0)

我不确定它是否正在缓存,因为(a)通常在构建输出中注明,是否使用了缓存以及(b)构建'应检测目录中已更改的内容并使缓存无效。

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

答案 7 :(得分:0)

以上解决方案都不适合我,但最终起作用的是以下步骤:

  1. 将文件复制/移动到docker app文件夹之外
  2. 删除要更新的文件
  3. 无需更新文件即可重建docker img
  4. 将复制的文件移回docker app文件夹
  5. 再次重建docker映像

    现在,该图像将包含对该文件的更新。

答案 8 :(得分:-2)

您正尝试使用新图片中的内容更新现有卷,但不起作用。

https://github.com/Rainer88/MEAN-Chapterized.git

国:

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