Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker: How to update your container when your code changes

I am trying to use Docker for local development. The problem is that when I make a change to my code, I have to run the following commands to see the updates locally:

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

That's quite a mouthful, and takes a while. (Possibly I could make it into a bash script, but do you think that is a good idea?)

My real question is: Is there a command that I can use (even manually each time) that will update the image & container? Or do I have to go through the entire workflow above every time I make a change in my code?

Just for reference, here is my Dockerfile and 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"
like image 625
Ben Avatar asked Aug 06 '20 08:08

Ben


People also ask

Does Docker automatically update container?

Your containers are now set up to automatically update whenever you push a new Docker image to your image repository, or when an external maintainer updates an image you're watching.

Can we update Docker image?

Like, you can create new files, you can install new modules, packages etc.. These changes will persist on the container as long as it exists. Consider the situation, your Docker container exited/stopped and you are unable to start the containers using docker start command.


2 Answers

Even though there are multiple good answers to this question, I think they missed the point, as the OP is asking about the local dev environment. The command I usually use in this situation is:

docker-compose up -d --build

If there aren't any errors in Dockerfile, it should rebuild all the images before bringing up the stack. It could be used in a shell script if needed.

#!/bin/bash

sudo docker-compose up -d --build

If you need to tear down the whole stack, you can have another script:

#!/bin/bash

sudo docker-compose down -v

The -v flag removes all the volumes so you can have a fresh start.

NOTE: In some cases, sudo might not be needed to run the command.

like image 178
Marko E Avatar answered Oct 19 '22 05:10

Marko E


When a docker image is build the artifacts are already copied and no new change can reflect until you rebuild the image.

But

If it is only for local development, then you can leverage volume sharing to update code inside container in runtime. The idea is to share your app/repo directory on host machine with /usr/src/app (as per your Dockerfile) and with this approach your code (and new changes) will be appear on both host and the running container.

Also, you will need to restart the server on every change and for this you can run your app using nodemon (as it watches for changes in code and restarts the server)

Changes required in Dockerfile.

services:
  web:
    ...
    container_name: web
    ...
    volumes:
      - /path/in/host/machine:/usr/src/app
    ...
    ...
    ports:
      - "3000:3000"
    depends_on:
      - mongo
like image 5
Oli Avatar answered Oct 19 '22 05:10

Oli