我已经为ASP.NET和MSSQL Server设置了两个Windows容器。在第一个Docker-Compose上,构建一切都按预期工作。然后,在我对自定义Dockerfile进行了一些更改并再次运行Docker-Compose构建后,它再次使用旧容器,而不是进行任何更改。
我假设当我进行构建时,它会创建一个新容器。我是否误会了Docker的工作方式?
这是docker-compose.yml
version: '3'
services:
db:
image: microsoft/mssql-server-windows-developer
environment:
sa_password: "Password1234!"
ACCEPT_EULA: "Y"
ports:
- "8003:1433"
build:
context: .
dockerfile: mssql.dockerfile
web:
build:
context: .
dockerfile: web.dockerfile
image: mcr.microsoft.com/dotnet/framework/aspnet:4.8
#volumes:
# - .:C:/inetpub/wwwroot
ports:
- "8080:80"
- "8081:431"
这是mssql.dockerfile
# escape=`
FROM microsoft/mssql-server-windows-developer
#set shell
SHELL ["powershell.exe", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
#make temp folder
RUN mkdir C:temp
#copy script to temp folder
COPY DownloadDatabase.ps1 C:temp
COPY RestoreDatabase.ps1 C:temp
#run script to retrieve production database
WORKDIR C:temp
RUN .DownloadDatabase.ps1 -sourcefile <url> -destinationfile <target>
CMD .RestoreDatabase.ps1
很容易判断图像是否已被重新使用,因为mkdir c: temp错误说目录已经存在。
编辑:我已经尝试了Docker组成的所有选项。无缓存,force-rm
docker-compose build
仅构建图像但不启动容器。
这就是为什么不应用您对Dockerfile的更改的原因。您已经重建了图像,但没有重建容器。这就是为什么启动的容器previoulsy基于图像的较旧版本的原因。
docker-compose up
来自Docker文档:
如果有现有的服务容器,并且在容器创建后更改了服务的配置或图像,则docker-compose构造通过停止和重新创建容器(保留安装的卷(来拾取更改。要防止构成更改,请使用-no-recreate标志。
为了使您的图像和容器都重建,您必须添加此标志:
docker-compose up --force-recreate --build
这样您的容器基于正确的图像版本。
Docker文档的标志上的说明:
--build Build images before starting containers.
--force-recreate Recreate containers even if their configuration
and image haven't changed.
如果要为特定服务执行此操作,只需在命令行的末尾添加服务名称:
docker-compose up --force-recreate --build serviceName
如果要明确输出是-d
标志:
-d, --detach Detached mode: Run containers in the background,
print new container names. Incompatible with
事实证明,我只需要在docker-compose build
之前做docker-compose pull
即可刷新Dockerfile!现在,它每次都会构建新的图像!