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

时间:2017-04-21 16:20:36

标签: docker docker-compose visual-studio-2017

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

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

搬运工-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会理解它没有那个图像并重新构建它吗?

3 个答案:

答案 0 :(得分:5)

首先,容器工具1.0(以前称为Docker Tools)是在VS 2017中构建的。您不需要安装0.41。事实上,0.41仅支持VS 2015.即使可能,请不要在VS 2017上安装0.41。

  
    

Visual Studio Docker Tools如何从头开始强制进行容器重建

  

对Visual Studio中的docker-compose.dcproj运行'clean'将为你做一个docker-compose。如果要重建映像,请切换到“Release”配置并对docker-compose.dcproj运行“rebuild”。

enter image description here

答案 1 :(得分:4)

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

要刷新PostgreSQL数据库环境变量,您需要删除数据库容器及其卷。当Visual Studio接下来运行docker-compose项目时,它将使用PostGres的新“安装”和更新的环境变量重新创建数据库容器及其关联的卷。 您将丢失数据,因此请先备份!

这是起点,两个容器:一个用于ASP.NET Core容器(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的前两位数作为简写。

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之类的命令来执行类似的拆卸,但我发现命令行更复杂,因为它包含Visual Studio需要的所有不同yml文件。例如,从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

这比手动操作更不直观。如果有人知道更好的方式,我全都耳朵!

答案 2 :(得分:-1)

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

The documentation on docker compose files may help