我在Visual Studio 2017(工具版0.41)中使用docker-compose来构建两个图像,一个ASP.NET Core API容器和一个PostgreSQL容器。我运行了Docker-Compose项目,一切正常 - 我可以从Api容器访问数据库。
我现在想将PostgreSQL环境变量POSTGRES_USER
,POSTGRES_PASSWORD
和POSTGRES_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会理解它没有那个图像并重新构建它吗?
答案 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”。
答案 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 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)
帮助我理解容器图像与容器本身的想法是将容器图像视为二进制文件,将单个容器视为一个过程。