如何从较新的映像更新Docker容器?

时间:2017-01-13 11:11:27

标签: docker docker-compose dockerfile

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

- 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

  

你好1

现在,假设我执行以下步骤:

  1. 在我的本地计算机上使用file.txt更新Hello 2的内容。
  2. 构建我的应用的新图片(复制新版file.txt
  3. 将其标记并将其作为版本0.2.0推送到Docker Hub。
  4. 更改服务器上的docker-compose.yml文件,告诉我现在使用michaelperrin/app-test:0.2.0作为我的应用。
  5. 运行docker-compose up -d(和docker-compose restart以确定)。
  6. 然后终端输出:

    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)中的一个卷。

1 个答案:

答案 0 :(得分:2)

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

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