Visual Studio Docker 工具如何强制从头开始重建容器

Visual Studio Docker Tools how to force a container rebuild from scratch

我正在使用 docker-compose in Visual Studio 2017(工具版本 0.41)来构建两个图像,一个 ASP.NET Core API 容器和一个 PostgreSQL 容器。我 运行 Docker-Compose 项目,一切正常 - 我可以从 Api 容器访问数据库。

我现在想将 PostgreSQL 环境变量 POSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DB 更改为如下新值:

docker-compose.yml:

services:
    mcodatabase:
        image: mcodatabase
        build:
        context: ./Data
        dockerfile: Dockerfile
        restart: always
        ports:
        - 5432:5432
        environment:
        POSTGRES_USER: mcodevuser
        POSTGRES_PASSWORD: password
        POSTGRES_DB: mcodev
        volumes:
        - postgresdata:/var/lib/postgresql/data
        networks:
        - mconetwork
    mcoapi:
        image: mcoapi
        build:
        context: ./Mco.Api
        dockerfile: Dockerfile
        ports:
        - 56107:80
        links:
        - mcodatabase
        depends_on:
        - "mcodatabase"
        networks:
        - mconetwork

    volumes:
    postgresdata:

    networks:
    mconetwork:
        driver: bridge

但是,据我了解,图像已经创建。我想从数据库图像 mcodatabase.

开始

这是我的图片:

c:\Projects\v4>docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
mcodatabase            dev                 96c9ba7509ed        2 hours ago         267 MB
mcoapi                 dev                 f238b18ab9bb        26 hours ago        288 MB
microsoft/aspnetcore   1.1                 b186ab38f718        8 days ago          288 MB
postgres               latest              ff0943ecbb3c        13 days ago         267 MB
d4w/nsenter            latest              9e4f13a0901e        7 months ago        83.8 kB

有没有办法用这个工具做到这一点?

如果不是,使用 >docker rmi mcodatabase:dev 删除图像是否有任何问题?当我下次构建时,docker-compose 会明白它没有那个图像并重新构建它吗?

帮助我理解容器镜像与容器本身的一个想法是将容器镜像视为二进制文件,将单个容器视为一个进程。

The documentation on docker compose files may help

还有一个命令行解决方案。

要刷新 PostgreSQL 数据库环境变量,您需要删除数据库容器及其卷。当 Visual Studio 接下来 运行 是 docker-compose 项目时,它将使用新的 'install' PostGres 和更新的环境变量重新创建数据库容器及其关联的卷。 你会丢失你的数据,所以先备份!

这里是起点,两个容器:一个用于 ASP.NET 核心容器 (mcoapi),一个用于数据库 (mcodatabase)。 Mco 是我们公司的缩写。 \v4 是我的 Visual Studio 解决方案的根,但这些命令可以从任何地方 运行 因为我们没有使用 docker-compose 命令行(请参阅下面的原因)。

C:\Projects\v4>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES
809b90e22290        mcoapi:dev          "tail -f /dev/null"      About an hour ago   Up About an hour    0.0.0.0:32776->80/tcp, 0.0.0.0:56107->80/tcp   dockercompose320715364_mcoapi_1
86d9036daccf        mcodatabase:dev     "docker-entrypoint..."   About an hour ago   Up About an hour    0.0.0.0:5432->5432/tcp                         dockercompose320715364_mcodatabase_1

首先,我停止容器。我使用 CONTAINER_ID 的前两位数字作为 shorthand.

C:\Projects\v4>docker stop 80
C:\Projects\v4>docker stop 86

现在我移除容器。我需要删除两者,因为我相信它们都使用相同的 docker 卷。

C:\Projects\v4>docker rm 80
C:\Projects\v4>docker rm 86

我现在没有容器了。

C:\Projects\v4>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

我现在可以删除存储数据库的卷。

在你这样做之前,备份你需要的任何数据,这将擦除数据库!

接下来,我检查一下安装了哪些卷:

C:\Projects\v4>docker volume ls
DRIVER              VOLUME NAME
local               dockercompose320715364_postgresdata

我现在可以使用 >docker volume rm dockercompose320715364_postgresdata 删除它,但我更喜欢 volume prune,它会删除不再使用的卷。如果我忘记取出容器,我很快就会知道。在警告处给出 y

C:\Projects\v4>docker volume prune
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
dockercompose320715364_postgresdata

Total reclaimed space: 45.95 MB

我们现在可以更改 docker-compose.yml 中的环境变量。下面我只改了environment:.

下面的内容
version: '2'

services:
mcodatabase:
    image: mcodatabase
    build:
    context: ./Data
    dockerfile: Dockerfile
    restart: always
    ports:
    - 5432:5432
    environment:
    POSTGRES_USER: myNewUser
    POSTGRES_PASSWORD: myNewPassword
    POSTGRES_DB: myNewDb
    volumes:
    - postgresdata:/var/lib/postgresql/data
    networks:
    - mconetwork

[snip for brevity]

我现在 运行 在 Visual Studio 中 docker-compose 项目,并使用新值重新创建数据库容器。

为什么我没有从命令行调用 docker-compose

可以在命令行上使用类似 docker-compose down 的命令来执行类似的拆卸,但我发现命令行更复杂,因为它包含所有不同的 yml 文件 Visual Studio需要。例如,从 Visual Studio 工具调用的 up 是:

docker-compose -f "C:\Projects\v4\docker-compose.yml" -f "C:\Projects\v4\docker-compose.override.yml" -f "C:\Projects\v4\docker-compose.vs.debug.yml" -p dockercompose320715364 up -d

这不如手动操作直观。如果有人知道更好的方法,我洗耳恭听!

首先,容器工具1.0(以前称为Docker工具)内置于VS 2017中。您不需要安装0.41。事实上,0.41 仅支持 VS 2015。请不要在 VS 2017 上安装 0.41,即使可以。

Visual Studio Docker Tools how to force a container rebuild from scratch

运行 'clean' 对抗 Visual Studio 中的 docker-compose.dcproj 将为您做 docker-compose down。如果你想重建图像,切换到 'Release' 配置和 运行 'rebuild' 反对 docker-compose.dcproj.