在重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中应该有这个支持,但是现在这足以满足我的需要了。