【问题标题】:Docker: How to update your container when your code changesDocker:如何在代码更改时更新容器
【发布时间】:2020-08-06 08:34:16
【问题描述】:

我正在尝试使用 Docker 进行本地开发。问题是当我对代码进行更改时,我必须运行以下命令才能在本地查看更新:

docker-compose down
docker images # Copy the name of the image
docker rmi <IMAGE_NAME>
docker-compose up -d

这是一口,需要一段时间。 (也许我可以把它变成一个 bash 脚本,但你认为这是个好主意吗?)

我真正的问题是:我可以使用(甚至每次手动)更新图像和容器的命令吗?还是每次我对代码进行更改时,我都必须完成上述整个工作流程

仅供参考,这里是我的Dockerfiledocker-compose.yml

Dockerfile

FROM node:12.18.3

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

EXPOSE 4000

CMD ["npm", "start"]

docker-compose.yml

version: "2"

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: web
    restart: always
    ports:
      - "3000:3000"
    depends_on:
      - mongo
  mongo:
    container_name: mongo
    image: mongo
    volumes:
      - ./data:/data/db
    ports:
      - "27017:27017"

【问题讨论】:

  • 试试docker-compose up -d --build。它应该在开始时重建所有图像。
  • 我相信 bash 脚本是自动化此操作的好方法。如果您关心构建时间,您可以结合使用 docker cp 和 docker exec 来随时更新代码。我建议检查 VS Code 并在容器内开发 code.visualstudio.com/docs/remote/containers
  • @MarkoE - 你的解决方案奏效了!你能把它放在一个正确的答案中,我会把它标记为正确的吗?

标签: docker docker-compose dockerfile


【解决方案1】:

尽管这个问题有多个很好的答案,但我认为他们没有抓住重点,因为 OP 正在询问本地开发环境。这种情况我通常使用的命令是:

docker-compose up -d --build

如果 Dockerfile 中没有任何错误,它应该在启动堆栈之前重建所有图像。如果需要,它可以在 shell 脚本中使用。

#!/bin/bash

sudo docker-compose up -d --build

如果你需要拆掉整个堆栈,你可以有另一个脚本:

#!/bin/bash

sudo docker-compose down -v

-v 标志会删除所有卷,以便您重新开始。

注意:在某些情况下,运行命令可能不需要sudo

【讨论】:

  • 你太棒了。感谢您在这方面的帮助!他们真的应该有一个docker watch 选项,但是在我足够聪明来帮助构建它之前,我会保留我的批评并使用上述内容。仅供参考 - 我有一个错误,只出现在 docker 容器中。当我在本地运行开发而不使用 Docker 时,没有错误。因此,当您需要检查时,这是一个非常有用的工具。
  • 别担心,我最近在本地开发环境中遇到了类似的问题,所以如果我能帮助某人更快地解决他们的问题,我真的很乐意提供帮助。 :)
【解决方案2】:

构建 docker 映像时,工件已被复制,并且在您重新构建映像之前不会反映新的更改。

但是

如果仅用于本地开发,那么您可以利用卷共享在运行时更新容器内的代码。我们的想法是与/usr/src/app(根据您的 Dockerfile)共享您在主机上的 app/repo 目录,通过这种方法,您的代码(和新更改)将同时出现在主机和正在运行的容器上。

此外,您需要在每次更改时重新启动服务器,为此您可以使用nodemon 运行您的应用(因为它会监视代码更改并重新启动服务器)

Dockerfile 中所需的更改。

services:
  web:
    ...
    container_name: web
    ...
    volumes:
      - /path/in/host/machine:/usr/src/app
    ...
    ...
    ports:
      - "3000:3000"
    depends_on:
      - mongo

【讨论】:

    【解决方案3】:

    您可以使用Docker Swarm 作为编排工具来应用滚动更新。检查Apply rolling updates to a service

    基本上你发出一次docker compose up 并可能使用一个shell 脚本来执行它,一旦你让你的容器运行然后你可以创建一个Jenkinsfile 或配置一个CI/CD 管道来拉取更新的图像并应用它使用docker service update &lt;NEW_IMAGE&gt; 运行具有先前图像的容器。

    【讨论】:

    • 问题是关于本地开发环境,而不是具有专用 CI 系统的多主机集群环境。
    • @DavidMaze,我明白你的意思,但用户不能在本地机器上设置这个环境吗?我认为也不需要专用 CI 系统(我刚刚建议使用may),因为用户可以手动发出命令,甚至他可以在本地机器上配置 CI。我还建议使用脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2017-01-29
    • 2023-02-25
    • 2015-02-16
    • 2020-03-20
    • 2021-12-17
    • 2020-06-23
    相关资源
    最近更新 更多