COPY 사용방법

# 문법
COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [컨테이너에서 파일이 위치할 경로]

# 예시
COPY app.txt /app.txt

 

 

Dockerfile 에 작성

  • 파일 복사
FROM ubuntu

COPY app.txt /app.txt

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드
  • 폴더 복사
FROM ubuntu

COPY my-app /my-app/

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드
  • 와일드 카드 이용하여 복사
FROM ubuntu

COPY *.txt /text-files/

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드
  • 모든 파일 복사
FROM ubuntu

COPY ./ /

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드

 

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

Given-When-Then은 주로 BDD(Behavior-Driven Development)에서 사용되는 테스트 시나리오 작성 패턴으로 테스트 의도를 쉽게 공유하고 이해할 수 있게 해줍니다.

 

  • Given (상황 설정):
    • 테스트의 시작 상태 또는 전제 조건을 설정합니다.
    • 애플리케이션이 어떤 상태에 있는지를 설명합니다.
  • When (행동):
    • 테스트하려는 특정 행동이나 이벤트를 정의합니다.
    • 애플리케이션이 처리해야 할 동작을 설명합니다.
  • Then (결과):
    • 행동이 발생한 후 기대하는 결과를 정의합니다.
    • 애플리케이션이 어떻게 반응해야 하는지를 설명합니다.
  • 예시
    • (Given) 사용자가 로그인하지 않은 상태에서 시작한다.
    • (When) 사용자가 로그인 버튼을 클릭한다.
    • (Then) 사용자가 대시보드 페이지로 이동한다.

e2e 테스트 예시

import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from './../src/app.module';

describe('AuthController (e2e)', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  afterAll(async () => {
    await app.close();
  });

  it('등록되지 않은 사용자가, 로그인을 요청을 시도한다. 그러면 401 Unauthorized 상태 코드를 받아야 한다', async () => {
    // Given: 사용자가 등록되지 않은 상태
    const loginPayload = {
      email: 'nonexistent@example.com',
      password: 'invalidpassword',
    };

    // When: 사용자가 로그인 요청을 시도한다
    const response = await request(app.getHttpServer())
      .post('/auth/login')
      .send(loginPayload);

    // Then: 401 Unauthorized 상태 코드를 받아야 한다
    expect(response.status).toBe(401);
  });
});

 

 

라이브러리 설치

- Nest.js 를 이용하여 프로젝트를 생성하면 기본적으로 설치되어 있는 라이브러리

$ npm init
$ npm i -D jest ts-jest @jest/globals @types/jest

 

- API 테스트를 위해 설치해야하는 라이브러리

$ npm i supertest

 

 

테스트 파일의 형식

  • ___.test.ts
  • ___.spec.ts

실행 방법 ( pacakge.json 참고)

$ npm run test

 

Dockerfile

Docker 이미지를 만들게 해주는 파일

DockerHub 에 올려놓은 Docker 이미지와는 다르다. 

 

베이스 이미지를 생성하는 FROM

컨테이너를 특정 초기 이미지(베이스 이미지)를 생성하는 역할.

컨테이너를 생성할 시 추가적인 셋팅을 할수 있게 해주는 역할

 

예를 들어, 컴퓨터나 랩탑을 사면 기본적으로 설치되어 있는 프로그램들이 있다. 이러한 것들이 베이스 이미지와 똑같다.

 

도커의 경우에는 컨테이너를 새로 띄워서 미니 컴퓨터 환경을 구출할 때

필요에 따라 설치하고 싶은 기본 프로그램을 선택하는 옵션이라고 볼 수 있다.  

 

<사용방법>

FROM (이미지명) # 최신버전 사용
FROM (이미지명):(태그명) # 태그명 버전 사용

 

Dockerfile 을 이용하여 베이스 컨터이너 띄우기

  • Dockerfile 생성
From node

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어

     - ENTRYPOINT : 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 뜻한다. 쉽게 설명하자면 미니 컴퓨터의 전원을 키고나서 실행시키고 싶은 명령어를 적으면 된다. 

  • 이미지 만들고 컨테이너 띄우기
$ docker build -t my-node-server . # 이미지 생성
$ docker run -d my-node-server # 이미지를 기반으로 컨테이너 생성
$ docker ps # 실행 중인 컨테이너 조회
$ docker exec -it [컨테이너 ID] bash # 컨테이너 접속

$ node -v # Node 설치되어 있는 지 확인

 -  docker build -t my-node-server .

      -  my-node-server : 이미지 이름

      -  .  : Dockerfile 이 존재하는 디렉터리 경로

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

MySQL 컨테이너 띄우기

$ cd /Users/jaeseong/Documents/Develop
$ mkdir docker-mysql # MySQL 데이터를 저장하고 싶은 폴더 만들기

$ docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 -v /{호스트의 절대경로}/mysql_data:/var/lib/mysql mysql
  • 호스트의 절대경로 pwd 명령어로 볼륨으로 사용하고자 하는 경로를 확인한 뒤 입력해주자.
  • mysql_data : mysql 을 저장하싶은 폴더명
  • : 이 후는 컨테이너 내부의 MySQL 위치(

(주의) 처음 이미지를 실행 시킬 때 mysql_data 디렉토리를 미리 만들어 놓으면 안 된다.

{호스트의 디렉토리 절대 경로}에 이미 디렉토리가 있으면 
호스트의 디렉터리(mysql_data)가 컨테이너의 디렉터리(/var/lib/mysql)를 덮어씌운다.

 

mysql_data 디렉토리를 미리 만들어놓을 경우,

         기존 컨테이너의 /var/lib/mysql 파일들을 전부 삭제한 뒤에 

          mysql_data로 덮어씌워 버린다. 

 

MySQL 컨테이너에 접속해서 데이터베이스 만들기

$ docker exec -it [MySQL 컨테이너 ID] bash

$ mysql -u root -p

mysql> show databases;
mysql> create database mydb;
mysql> show databases;

 

컨테이너 종료 후 다시 실행해보기

# 컨테이너 종료
$ docker stop [MySQL 컨테이너 ID]
$ docker rm [MySQL 컨테이너 ID]

# 컨테이너 생성
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /{호스트의 절대경로}/docker-mysql/mysql_data:/var/lib/mysql -d mysql

$ docker exec -it [MySQL 컨테이너 ID] bash
$ mysql -u root -p
mysql> show databases; # 아까 생성한 데이터베이스가 없어진 걸 확인할 수 있다.

 

 

 

# 컨테이너 종료
$ docker stop [MySQL 컨테이너 ID]
$ docker rm [MySQL 컨테이너 ID]

# 비밀번호 바꿔서 컨테이너 생성
$ docker run -e MYSQL_ROOT_PASSWORD=pwd1234 -p 3306:3306 -v /{호스트 절대 경로}/docker-mysql/mysql_data:/var/lib/mysql -d mysql

$ docker exec -it [MySQL 컨테이너 ID] bash
$ mysql -u root -p # 접속이 안 됨...

!! 분명 MYSQL_ROOT_PASSWORD 값을 바꿔서 새로 컨테이너를 띄웠는데 비밀번호는 바뀌지 않은걸까? 이 부분 때문에 많은 분들이 헤맨다. 그 이유는 Volume으로 설정해둔 폴더에 이미 비밀번호 정보가 저장되버렸기 때문이다. 

 

 

[출처]

[인프런] 비전공자도 이해할 수 있는 Docker 입문/실전

+ Recent posts