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