我有一个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来说相对较新,所以我不确定我是否误解了这个过程的任何部分!任何指导都将不胜感激。
答案 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)
以上解决方案都不适合我,但最终起作用的是以下步骤:
再次重建docker映像
现在,该图像将包含对该文件的更新。
答案 8 :(得分:-2)
您正尝试使用新图片中的内容更新现有卷,但不起作用。
https://github.com/Rainer88/MEAN-Chapterized.git
国:
Changes to a data volume will not be included when you update an image.