Docker: Как обновить контейнер при изменении кода - PullRequest
2 голосов
/ 06 августа 2020

Я пытаюсь использовать Docker для локальной разработки. Проблема в том, что когда я вношу изменения в свой код, мне приходится запускать следующие команды, чтобы увидеть обновления локально:

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

Это довольно утомительно и требует времени. (Возможно, я мог бы превратить его в сценарий bash, но как вы думаете, это хорошая идея?)

Мой настоящий вопрос: есть ли команда, которую я могу использовать (даже каждый раз вручную), обновит изображение и контейнер? Или мне нужно go через весь рабочий процесс каждый раз, когда я вношу изменение в свой код?

Для справки, вот мой Dockerfile и docker-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"

Ответы [ 3 ]

4 голосов
/ 06 августа 2020

Несмотря на то, что на этот вопрос есть несколько хороших ответов, я думаю, они упустили суть, поскольку OP спрашивает о локальной среде разработки. В этой ситуации я обычно использую следующую команду:

docker-compose up -d --build

Если в Dockerfile нет ошибок, он должен перестроить все изображения перед вызовом стека. При необходимости его можно использовать в сценарии оболочки.

#!/bin/bash

sudo docker-compose up -d --build

Если вам нужно удалить весь стек, вы можете использовать другой сценарий:

#!/bin/bash

sudo docker-compose down -v

Флаг -v удаляет все тома, чтобы можно было запустить fre sh.

ПРИМЕЧАНИЕ. В некоторых случаях sudo может не понадобиться для запуска команды.

1 голос
/ 06 августа 2020

При построении образа docker артефакты уже скопированы, и никакие новые изменения не могут отразиться, пока вы не перестроите образ.

Но

Если это только для локальной разработки, тогда вы можете использовать совместное использование томов для обновления кода внутри контейнера во время выполнения. Идея состоит в том, чтобы поделиться своим каталогом app / repo на хост-машине с помощью /usr/src/app (согласно вашему Dockerfile), и при таком подходе ваш код (и новые изменения) будут отображаться как на хосте, так и в работающем контейнере.

Кроме того, вам нужно будет перезапускать сервер при каждом изменении, и для этого вы можете запускать свое приложение, используя nodemon (поскольку оно отслеживает изменения в коде и перезапускает сервер)

Требуются изменения в Dockerfile.

services:
  web:
    ...
    container_name: web
    ...
    volumes:
      - /path/in/host/machine:/usr/src/app
    ...
    ...
    ports:
      - "3000:3000"
    depends_on:
      - mongo
0 голосов
/ 06 августа 2020

Вы можете использовать Docker Swarm в качестве инструмента оркестровки для применения скользящих обновлений. Отметьте Применить скользящие обновления к службе .

Обычно вы запускаете docker compose up один раз и, возможно, делаете это с помощью сценария оболочки, и как только вы запускаете свои контейнеры, а затем вы можете создать Jenkinsfile или настройте конвейер CI / CD, чтобы получить обновленный образ и применить его к работающему контейнеру с предыдущим образом с docker service update <NEW_IMAGE>.

...