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

Ale*_*x H 23 docker dockerfile docker-compose

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

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

FROM php:7.1-fpm
COPY ./public /var/www/html/public
COPY ./code /var/www/html/code
Run Code Online (Sandbox Code Playgroud)

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

docker-compose -f docker-compose-staging.yml up -d
Run Code Online (Sandbox Code Playgroud)

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

docker-compose -f docker-compose-staging.yml build app
Run Code Online (Sandbox Code Playgroud)

此重建的输出表明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
Run Code Online (Sandbox Code Playgroud)

然后我使用以下部署:

docker-compose -f docker-compose-staging.yml up -d
Run Code Online (Sandbox Code Playgroud)

使用以下输出:

Recreating docker_app_1
Recreating docker_php_1
Recreating docker_nginx_1
Run Code Online (Sandbox Code Playgroud)

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

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

Har*_*ria 12

这是因为缓存.

跑,

docker-compose build --no-cache
Run Code Online (Sandbox Code Playgroud)

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

然后,

docker-compose -f docker-compose-staging.yml up -d
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不起作用.COPY命令的输出通常表示是否正在使用缓存,并且它未在我的原始帖子中使用.我试图指定no-cache选项但是文件没有更新. (8认同)
  • 这对我有用,但每次更改一些即css属性时这样做很痛苦.我可能天真,但有没有办法让一种监视器跟踪这种变化?仅供参考我正在使用golang. (6认同)
  • 难道缓存不应该识别出文件已更改并被指示重新构建吗?否则,缓存会如何改变? (5认同)
  • @Plaix 我很惊讶这不是默认行为。 (2认同)

小智 8

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

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

RUN rm -rf path/to/your/app
COPY . path/to/your/app
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

docker volume rm [VOLUME_ID]
Run Code Online (Sandbox Code Playgroud)

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

docker inspect [CONTAINER_ID]
Run Code Online (Sandbox Code Playgroud)

  • 太感谢了!我就是这种情况。这是通过 compose:`docker-compose down --volumes` (/sf/answers/3662876381/) (2认同)

Gra*_*ame 6

只是将其留在这里,以便我两周后返回此页面。

您可能不想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
Run Code Online (Sandbox Code Playgroud)

  • 你两周后回来了吗? (8认同)
  • 我做到了!我是新来的,所以他们不让我发表评论! (2认同)

小智 -5

您正在尝试使用新映像中的内容更新现有卷,但这不起作用。

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

状态:

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

  • 更新数据的最佳解决方案是什么?每次需要更新文件时我们都需要删除图像吗? (9认同)
  • 链接已损坏,未提供解决方案。 (4认同)