Blog
Tools
docker-compose up --build

docker-compose up --build로 이미지 새로 빌드하여 컨테이너 실행하기

docker-compose는 여러 컨테이너를 정의하고 실행하기 위한 도구입니다. 개발 환경에서 여러 서비스(예: 웹 애플리케이션, 데이터베이스, 캐시)를 한 번에 관리할 수 있어 매우 유용합니다.

docker-compose.yml 파일에 서비스들을 정의해두고 docker-compose up 명령어를 사용하면, 정의된 모든 서비스를 한 번에 실행할 수 있습니다.

docker-compose up vs docker-compose up --build

docker-compose up

docker-compose up 명령어는 docker-compose.yml 파일에 정의된 서비스들을 실행합니다. 만약 서비스에 해당하는 도커 이미지가 로컬에 이미 존재한다면, docker-compose는 그 기존 이미지를 사용하여 컨테이너를 시작합니다. Dockerfile이나 소스코드가 변경되었더라도 이미지가 존재하면 새로 빌드하지 않습니다.

docker-compose up --build

--build 플래그는 docker-compose up 명령어에 추가적인 동작을 지시합니다. 컨테이너를 시작하기 전에 Dockerfile을 사용하여 이미지를 강제로 다시 빌드합니다.

이 명령어는 다음과 같은 상황에서 유용합니다.

  • Dockerfile의 내용이 변경되었을 때
  • 애플리케이션의 소스 코드가 변경되어 이미지에 반영해야 할 때 (예: 새로운 의존성 패키지 설치)

소스 코드가 변경되었을 때, Dockerfile에서 COPY 또는 ADD 명령어를 사용하여 소스 코드를 이미지에 복사하는 부분이 있다면 --build 옵션을 사용해야 변경사항이 이미지에 반영됩니다.

사용 예시

간단한 Node.js 애플리케이션을 예시로 들어보겠습니다.

프로젝트 구조

.
├── docker-compose.yml
├── Dockerfile
└── app.js

app.js

const http = require('http');
 
const hostname = '0.0.0.0';
const port = 3000;
 
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});
 
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Dockerfile

FROM node:18
 
WORKDIR /usr/src/app
 
COPY . .
 
EXPOSE 3000
 
CMD [ "node", "app.js" ]

docker-compose.yml

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"

실행

이제 터미널에서 다음 명령어를 실행합니다.

docker-compose up --build

이 명령어를 실행하면 docker-compose는 현재 디렉토리의 Dockerfile을 사용하여 이미지를 새로 빌드하고, web이라는 이름의 서비스를 실행합니다.

소스 코드 변경 후

만약 app.js의 "Hello World"를 "Hello, Docker!"로 변경했다고 가정해봅시다.

// app.js
// ...
  res.end('Hello, Docker!\n');
// ...

단순히 docker-compose up을 실행하면, 기존에 빌드된 이미지를 사용하기 때문에 변경사항이 반영되지 않습니다. 변경된 소스 코드를 이미지에 반영하고 컨테이너를 다시 실행하려면 --build 옵션을 사용해야 합니다.

docker-compose up --build

이제 http://localhost:3000에 접속하면 "Hello, Docker!" 메시지를 확인할 수 있습니다.

결론

docker-compose up --buildDockerfile이나 소스 코드의 변경 사항을 도커 이미지에 반영하여 컨테이너를 실행하고 싶을 때 사용하는 필수적인 명령어입니다. 개발 과정에서 코드 변경 후 컨테이너에 변경 내용이 적용되지 않는다면 --build 옵션을 사용했는지 확인해보는 것이 좋습니다.