Docker 容器不会在代码更改时更新

Sar*_*tra 6 docker dockerfile docker-compose

我有一个 Dockerfile 来构建我的节点容器,它如下所示:

FROM node:12.14.0

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 4500

CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)

基于此 docker 文件,我使用 docker compose 运行此容器并将其链接到 mongo 容器,以便它引用 mongo-service。docker-compose.yml 如下所示

version: '3'
services:
    backend:
        container_name: docker-node-mongo-container
        restart: always
        build: .
        ports: 
            - '4700:4500'
        links: 
            - mongo-service

    mongo-service:
        container_name: mongo-container
        image: mongo
        ports: 
            - "27017:27017"

Run Code Online (Sandbox Code Playgroud)

预期行为:每次我在本地计算机上对项目进行新更改时,我都希望 docker-compose 重新启动,以便反映新更改。

当前行为:为了使新更改反映在 docker-compose 上,我必须执行 docker-compose down 然后删除图像。我猜它必须重建图像。我如何做到这一点,以便每当我进行更改时,dockerfile 都会构建一个新映像?

我知道需要使用卷。我只是不明白如何。有人可以帮我吗?码头工人

Dav*_*aze 8

当您进行更改时,您需要运行docker-compose up --build. 这将重建您的映像并根据需要重新启动容器。

Docker 没有检测代码更改的功能,并且它不打算用作实时重新加载环境。卷不是用来保存代码的,人们在尝试它时会遇到一些问题(Docker 文件同步可能很慢或不一致;将node_modules树放入匿名卷中会主动忽略对 的更改package.json;它对集群环境的移植特别糟糕,例如Kubernetes)。您可以使用指向 Docker MongoDB 的主机节点进行日常开发,并且仍然使用这种基于 Docker 的设置进行部署。


小智 8

为了让您“重新启动”您的 docker 应用程序,您需要使用 docker 卷。

添加到您的 docker-compose.yml 文件中,如下所示:

version: '3'
services:
    backend:
        container_name: docker-node-mongo-container
        restart: always
        build: .
        ports: 
            - '4700:4500'
        links: 
            - mongo-service
        volumes:
            - .:/usr/src/app


    mongo-service:
        container_name: mongo-container
        image: mongo
        ports: 
            - "27017:27017"
Run Code Online (Sandbox Code Playgroud)

Volumes 标签很简单:“嘿,将容器外部的当前文件夹(点)映射到容器内部的工作目录”。