使用Docker-Compose Build时,Docker不会创建新容器



我已经为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!现在,它每次都会构建新的图像!

最新更新