我已经为ASP.NET和MSSQL服务器设置了两个Windows容器。在第一个docker-compose构建中,一切正常。然后,在对自定义dockerfile进行一些更改并再次运行docker-compose build之后,它将再次使用旧容器,而不进行任何更改。
我认为在进行构建时会创建一个新的容器。我是否误解了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 compose上的所有选项。无缓存,强制rm
答案 0 :(得分:1)
docker-compose build
仅生成图像,但不启动容器。
这就是为什么不应用您在dockerfile中所做的更改的原因。您已经重建了映像,但是没有重建容器。这就是为什么容器previoulsy启动基于该映像的旧版本的原因。
docker-compose up
来自Docker documentation:
如果已有用于服务的容器,并且在容器创建后更改了服务的配置或映像,则docker-compose up会通过停止并重新创建容器(保留装入的卷)来获取更改。为了防止Compose获取更改,请使用--no-recreate标志。
为了确保可以同时重建图像和容器,您必须添加以下标志:
docker-compose up --force-recreate --build
这样,您的容器将基于正确的图像版本。
来自Docker documentation的标志说明:
--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
答案 1 :(得分:0)
事实证明,我只需要在docker-compose pull
之前执行docker-compose build
来刷新dockerfile!现在,它每次都会构建一个新图像!