2024-08-27-TIL
2024-08-27-TIL
Today I Learned
Multi-stage builds
컨테이너 이미지를 만들면서 빌드 등에는 필요하지만 최종 컨테이너 이미지에는 필요없는 환경을 제거할 수 있도록 단계를 나누어서 베이스 이미지를 만드는 방법
- https://docs.docker.com/build/building/multi-stage/
- https://nesoy.github.io/articles/2020-11/Docker-multi-stage-build
Dockerfile 안에 FROM을 여러 번 쓰면, FROM마다 새 빌드 단계(stage)가 시작되고 단계마다 다른 베이스 이미지를 쓸 수 있다. 앞 단계에서 컴파일러와 SDK로 결과물을 만들고, 마지막 단계에서는 COPY --from으로 결과물만 가져온다. 앞 단계의 SDK와 중간 산출물은 최종 이미지에 남지 않는다.
1
2
3
4
5
6
7
8
FROM golang:1.22 AS build
WORKDIR /src
COPY . .
RUN go build -o /bin/hello ./main.go
FROM scratch
COPY --from=build /bin/hello /bin/hello
CMD ["/bin/hello"]
단계에 AS build처럼 이름을 붙이면 --from=build로 가리킬 수 있다. 이름이 없으면 --from=0처럼 순서 번호로 가리켜야 해서, 단계 순서가 바뀌면 깨진다. docker build --target build처럼 특정 단계까지만 빌드할 수도 있어서, 디버깅용이나 테스트용 단계를 따로 두기 좋다.
ldd Command
- https://www.ibm.com/docs/en/aix/7.2?topic=l-ldd-command
- https://man7.org/linux/man-pages/man1/ldd.1.html
ldd는 실행 파일이나 공유 라이브러리가 필요로 하는 공유 라이브러리(shared object) 목록을 출력한다. ldd /bin/ls를 실행하면 libselinux.so.1 => /lib64/libselinux.so.1처럼 라이브러리 이름과 실제로 찾은 경로가 나온다. 위의 multi-stage 빌드에서 최종 단계를 scratch나 작은 베이스 이미지로 바꿀 때, 바이너리가 어떤 라이브러리에 동적으로 링크되어 있는지 확인하는 데 쓸 수 있다.
man page에는 보안 주의 사항이 있다. ldd는 경우에 따라 프로그램을 직접 실행해서 정보를 얻을 수 있으므로, 신뢰할 수 없는 실행 파일에는 절대 쓰지 말라고 한다. 이때는 objdump -p /path/to/program | grep NEEDED를 대안으로 제시한다.
점 이력, 선분 이력
- https://velog.io/@matisse/%EC%9D%B4%EB%A0%A5-%EA%B4%80%EB%A6%AC-%EC%A0%90%EC%9D%B4%EB%A0%A5-%EC%84%A0%EB%B6%84%EC%9D%B4%EB%A0%A5%EC%97%90-%EB%8C%80%ED%95%B4
데이터가 바뀐 기록을 남기는 두 가지 방식이다.
- 점 이력 : 변경된 시점 하나만 기록한다. 컬럼이 하나라 단순하지만, 두 변경 시점 사이의 특정 시점에 어떤 값이었는지 찾으려면 그 이전의 가장 가까운 기록을 따로 찾아야 한다.
- 선분 이력 : 시작 시점과 종료 시점 두 컬럼으로 값이 유효했던 기간을 기록한다. 현재 유효한 행은 종료 시점을
9999-12-31같은 먼 미래로 둔다.
선분 이력에서 값이 바뀌면 기존 행의 종료 시점을 변경 시점으로 닫고, 바뀐 값으로 새 행을 넣는다. 그러면 기간이 끊김 없이 이어지고, 현재 값은 종료 시점 = '9999-12-31'로, 특정 시점의 값은 시작 <= 시점 < 종료 조건으로 한 번에 조회할 수 있다. 대신 변경할 때마다 기존 행 갱신과 새 행 삽입을 한 트랜잭션으로 묶어야 기간이 겹치거나 비지 않는다.
MongoDB Atlas
- https://www.mongodb.com/ko-kr/docs/atlas/
MongoDB Atlas는 MongoDB가 제공하는 멀티 클라우드 데이터베이스 서비스다. AWS, Azure, Google Cloud 위에서 데이터베이스를 띄우고, 프로비저닝, 패치, 백업, 모니터링, 확장 같은 운영 작업을 대신 해 준다. 애플리케이션은 같은 MongoDB Query API로 접근하므로 드라이버와 코드가 직접 운영하는 MongoDB와 같은 방식으로 동작한다.
AI 키워드: EU AI Act
EU의 AI법(AI Act)이 8월 1일 발효됐다. AI를 위험도에 따라 나누어 규제하는 것이 기본 틀이다. 스팸 필터 같은 최소 위험 시스템에는 의무가 없고, 챗봇처럼 특정 투명성 위험이 있는 시스템은 사용자에게 기계와 대화하고 있다는 사실을 알려야 한다. 의무는 이후 3년에 걸쳐 단계적으로 적용된다. 기능이 아니라 쓰임새의 위험도로 규제 강도를 정한다는 말이구나.
댓글
아직 댓글이 없습니다