gpt4 book ai didi

docker - 如何从较新的镜像更新Docker容器?

转载 作者:行者123 更新时间:2023-12-02 19:09:50 28 4
gpt4 key购买 nike

我有一个具有以下文件结构的项目:

- Dockerfile
- app/
- file.txt
- uploads/
file.txt文件包含Hello 1。
Dockerfile生成应用程序图像,非常简单:
FROM busybox

COPY ./app /var/www/app
VOLUME /var/www/app/uploads

生成的镜像被推送到 michaelperrin/app-test存储库上的Docker Hub。

在部署应用程序的服务器上,我有以下 docker-compose.yml文件:
version: '2'
services:
app:
image: michaelperrin/app-test:0.1.0
working_dir: /var/www/app
volumes:
- /var/www/app

nginx:
image: nginx:1.11
volumes_from:
- app
working_dir: /var/www/app

它定义了两个容器:
  • 应用程序图像。
  • Nginx服务器,可以访问应用程序文件。

  • 该应用程序使用 docker-compose up -d命令运行。

    因此,运行 docker-compose exec nginx cat test-file.txt将显示:

    Hello 1



    现在,假设我执行以下步骤:
  • 在本地计算机上使用file.txt更新Hello 2的内容。
  • 构建我的应用程序的新镜像(复制新版本的file.txt)
  • 标记它,并将其作为0.2.0版本推送到Docker Hub上。
  • 更改服务器上的docker-compose.yml文件,以告知我现在对我的应用程序使用michaelperrin/app-test:0.2.0
  • 运行docker-compose up -d(当然要输入docker-compose restart)。

  • 然后终端输出:
    Status: Downloaded newer image for michaelperrin/app-test:0.2.0
    Recreating apptest_app_1
    Recreating apptest_nginx_1

    这是我的问题:

    如果我运行 docker-compose exec nginx cat test-file.txt,它仍将显示Hello 1, ,而不显示 Hello 2。

    我发现的唯一解决方案是执行以下操作:
    docker-compose stop app
    docker-compose rm app
    docker-compose up -d

    有更好的解决方案吗?
    rm解决方案的问题在于,它将删除我的应用程序可能在 app目录中的 /var/www/app/uploads容器中创建的所有其他文件(尽管该文件在 Dockerfile中声明为卷)。

    最佳答案

    我认为(真的希望)这是不可能的。您可以使用图像在创建时具有的状态从图像创建一个实例(容器)。当创建新图像对容器产生影响时,您会产生意想不到的副作用。

    因此,您应该删除旧容器,并使用新镜像构建新容器。

    关于docker - 如何从较新的镜像更新Docker容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41633283/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com