Dockerfiles 또는 이미지 커밋을 사용해야합니까?


81

이 두 가지 옵션에 대해 약간 혼란 스럽습니다. 관련이있는 것으로 보입니다. 그러나 그들은 실제로 호환되지 않습니다.

예를 들어 Dockerfiles를 사용하면 실제로 이미지에 커밋해서는 안되는 것 같습니다. git에서 Dockerfile을 실제로 추적하고 변경해야하기 때문입니다. 그렇다면 권위있는 것에 대한 모호성이 없습니다.

그러나 이미지 커밋은 정말 멋져 보입니다. 컨테이너를 직접 수정하고 변경 사항에 태그를 지정하여 다른 이미지를 만들 수 있다는 점이 정말 대단합니다. 이미지 커밋 기록에서 파일 시스템 차이와 같은 것을 얻을 수도 있다는 것을 이해합니다. 대박. 그러나 Dockerfiles를 사용해서는 안됩니다. 그렇지 않으면 이미지 커밋을 수행 한 경우 Dockerfile로 돌아가서 수행 한 작업을 나타내는 몇 가지 변경 작업을 수행해야합니다.

그래서 나는 찢어졌습니다. 이미지 커밋이라는 아이디어가 마음에 듭니다. Dockerfile에서 이미지 상태를 표시 할 필요가 없습니다. 바로 추적 할 수 있습니다. 그러나 이미지에있는 내용에 대한 빠른 개요를 제공하는 일종의 매니페스트 파일에 대한 아이디어를 포기하는 것이 불편합니다. 동일한 소프트웨어 패키지에서 호환되지 않는 두 가지 기능을 보는 것도 당황 스럽습니다.

누구든지 이것에 대해 생각이 있습니까? 이미지 커밋을 사용하는 것이 나쁜 습관으로 간주됩니까? 아니면 Puppet 시절의 파일을 매니페스트하기 위해 첨부 파일을 놓아야합니까? 어떻게해야합니까?

업데이트 :

이것이 의견 기반 질문이라고 생각하는 모든 사람들에게 나는 그렇게 확신하지 못합니다. 주관적인 특성이 있지만 대부분 객관적인 질문이라고 생각합니다. 또한이 주제에 대한 좋은 토론이 유익 할 것이라고 믿습니다.

결국이 게시물을 읽는 사람이 Dockerfile과 이미지 커밋이 서로 어떻게 관련되어 있는지 더 잘 이해할 수 있기를 바랍니다.

업데이트-2017/7/18 :

최근에 이미지 커밋의 합법적 인 사용을 발견했습니다. 회사에서 CI 파이프 라인을 설정하기 만하면 파이프 라인의 한 단계에서 앱 테스트가 컨테이너 내부에서 실행됩니다. 테스트 실행기 프로세스가이를 생성하고 (컨테이너의 파일 시스템에서) 컨테이너가 실행을 중지 한 후 종료 된 컨테이너에서 커버리지 결과를 검색해야합니다. 중지 된 컨테이너를 커밋하여 새 이미지를 만든 다음 커버리지 파일을 표시하고 stdout에 덤프하는 명령을 실행하여 이미지 커밋을 사용합니다. 그래서 이것을 갖는 것이 편리합니다. 이 매우 특정한 경우와는 별도로 Dockerfile을 사용하여 환경을 정의합니다.


2
여기에는 많은 철학이 있고 사람들의 철학이 다르기 때문에 이것은 아마도 나쁜 질문 일 수 있습니다. 하지만 저만의 철학은 항상 주어진 이미지를 정확히 재현하는 방법을 알고 싶고 그렇게 할 있는지 확인하는 것입니다. 골든 이미지를 사용하면 누군가가 상태 A에서 상태 B로 어떻게 이동했는지 알지 못하는 것은 매우 쉬운 반면, 빌드 프로세스를 주도하는 자동화에서는 잊을 방법이 없습니다. 그래서 개인적으로 예, 저는 Dockerfiles를 올바른 것으로 부르고 이미지 커밋 ( 수동 개입에 의존하는 모든 종류의 황금 이미지 처럼 ) 악을 저지 릅니다 . 하지만 저와 YMMV입니다.
Charles Duffy 2014 년

@CharlesDuffy이 질문이 SO에 속하지 않으면 어디로 가야합니까?
David Sanders

1
@CharlesDuffy 그건 그렇고, 이것이 의견 기반 질문이라는 데 동의하지 않습니다. 좀 더 맥락에 따라 정답이 아니라면 여기에 정답이 있어야합니다. 참고로, 내 질문을 Serverfault로 옮기기로 투표했습니다.
David Sanders

2
...*어깨를 으쓱하다*. 내 선호에 대한 구체적인 이유를 인용 할 수 있지만 다른 사람이 자신의 선호에 대해 인용하는 구체적인 이유보다 더 옳은 이유가 있습니까? 저는 황금 이미지 접근 방식의 팬인 사람들과 함께 일해 왔으며, 사실을 인용하여 누군가를이기는 것이 항상 가능한 것은 아닙니다. 왜냐하면 당사자는 솔루션의 다른 특성을 다른 범위로 평가할 수 있기 때문에 사실에 동의하는 것이 전적으로 가능하기 때문입니다. 그러나 결론에 동의하지 않습니다. 이것은 의견 기반 질문의 특징이며, 실제로 여기에 황금 이미지 팬이 나타나는지 확인하기를 기대합니다.
Charles Duffy 2014 년

1
나는 똑같은 것을 궁금해했고, 내 인상 (완전히 틀릴 수 있음)은 실제로 vms와 동일한 경우입니다-> vm 이미지를 다시 만드는 방법을 알고 싶지 않습니다. 제 경우에는 설치할 일반 .sh 스크립트가 있는데 왜이 스크립트를 유지하고 도커를 실행하고 효과적으로 호출 할 수 없는지 궁금합니다. 그런 식으로 골든 버전 이미지를 만듭니다. 내 스크립트는 로컬 PC에 설치하기 위해 작동하며, 도커를 사용하려는 이유는 여러 프로그램 인스턴스의 충돌을 처리하거나 파일 시스템을 깨끗하게 유지하는 것입니다.
Bradford Medeiros

답변:


47

Dockerfile은 이미지를 만드는 데 사용되는 도구입니다.

실행 결과는 docker build .커밋이있는 이미지이므로 commit 을 생성하지 않고 Dockerfile을 사용할 수 없습니다 . 문제는 어떤 것이 변경 될 때마다 이미지를 수동으로 업데이트 하여 황금 이미지의 저주에 자신을 파멸 시켜야한다는 것입니다 .

황금 이미지의 저주는 소프트웨어를 실행하기 위해 버그가있는 보안 구멍을 타는 기본 이미지로 계속 살아야하는 사람들에게 주어지는 끔찍한 저주입니다. 왜냐하면 그것을 만든 사람이 오래 전에 고대인에게 삼켜 졌거나 새로운 직업) 그리고 그 이미지에 들어간 imagemagic 버전을 어디서 얻었는지 아무도 모릅니다. 그리고 사장의 아들이 3 년 전에 고용 한 컨설턴트가 제공 한 C ++ 모듈과 연결되는 유일한 것입니다. 어쨌든 상관 없습니다. 왜냐하면 imagemagic이 사용하는 libstdc ++ 버전에서 어디서 왔는지 알아 내더라도 JNI는 지원 도구에서 긴 머리를 가진 인턴이 어쨌든 지원되지 않는 버전의 우분투에만 존재한다고 호출합니다.


3
이것은 실제로 나에게 문제의 핵심 인 것 같습니다. 이미지 커밋을 독점적으로 사용하는 경우 기본 이미지가 고착됩니다. 이미지에 대해 dist-upgrade를 할 수 있지만 그것은 악몽처럼 들립니다. 그런 종류의 정보를 Dockerfile에 깔끔하게 표시하는 것이 더 바람직한 것 같습니다. Docker가 공개 API의 일부로 이미지 커밋을 노출해서는 안된다고 생각합니다. 소개 문서의 설명 목적 외에는 합법적 인 용도로 사용되지 않는 것 같습니다.
David Sanders

7
난 그냥 :-( ... 그 예를하지 않았다
아서 Ulfeldt에게

22

솔루션의 장점과 불편 함을 모두 아는 것은 좋은 시작입니다. 두 가지를 혼합하는 것이 아마도 유효한 방법이기 때문입니다.

단점 : 골든 이미지 막 다른 골목을 피하십시오 .

이미지를 다시 빌드하는 방법을 잊어 버린 경우 커밋 만 사용하는 것은 좋지 않습니다. 이미지를 다시 빌드 할 수없는 상태를 원하지는 않습니다 . 이 최종 상태를 황금 이미지 라고합니다. 이미지는 각 단계에서 유일한 참조, 시작 지점 및 끝 지점입니다. 풀면 재건 할 수 없기 때문에 많은 문제가 발생합니다. 치명적인 막 다른 길은 언젠가는 새 시스템을 다시 빌드해야한다는 것입니다 (예를 들어 모든 시스템 라이브러리가 쓸모 없기 때문입니다). 무엇을 설치해야할지 모를 것입니다. 결국 시간이 많이 낭비됩니다.

참고로 , 히스토리 로그가 git에서와 같이 쉽게 사용 가능하다면 (diffs를 참조하고 다른 이미지에서 반복) 커밋보다 커밋을 사용하는 것이 더 좋을 것입니다. 이 딜레마.

장점 : 배포를위한 매끄러운 업그레이드

반면에, 계층화 커밋은 분산 업그레이드 측면에서 상당한 이점이 있으므로 대역폭 및 배포 시간에있어 상당한 이점이 있습니다. 제빵사가 팬케이크 (정확히도 커가 허용하는 것)를 처리 할 때 도커 이미지를 처리하기 시작하거나 테스트 버전을 즉시 배포하려는 경우, 작은 커밋 형식으로 작은 업데이트를 보내는 것이 더 기쁠 것입니다. 완전히 새로운 이미지. 특히 버그 수정을 조만간 자주 배포해야하는 고객을 위해 지속적으로 통합하는 경우.

두 가지 세계를 최대한 활용하십시오.

이러한 유형의 시나리오에서는 이미지의 주요 버전 에 태그를 지정하고 싶을 것입니다.Dockerfiles . 또한 태그가 지정된 버전을 기반으로 한 커밋 덕분에 지속적인 통합 버전을 제공 할 수 있습니다. 이는 Dockerfiles 및 계층화 커밋 시나리오의 장점과 불편 함을 완화합니다. 여기서 핵심은 이미지에 대해 수행 할 수있는 커밋 수를 제한하여 이미지 추적을 중단하지 않는다는 것입니다.

따라서 시나리오에 따라 다르며 단일 규칙을 찾으려고 시도해서는 안됩니다. 그러나 솔루션이 무엇이든간에 실제로 피해야 할 몇 가지 막 다른 골목이있을 수 있습니다 ( "골든 이미지"시나리오로 끝남).


수정 된 Dockerfile에서 다시 빌드 한 후 배포하기 위해 완전히 새로운 이미지를 풀다운 할 필요가 없도록 Docker가 지능적으로 이미지를 다시 빌드하지 않습니까?
David Sanders

1
@DavidSanders 완전히 새로운 이미지를 다운로드하는 것으로 끝나지 않을 것입니다. 그러나 결과가 변경되는 초기 교육은 다음 계층 전체를 무효화합니다. 악명 높게 'ADD'또는 모든 종속성 명령은 종종 단일 새 커밋으로 마지막에 수행 할 수있는 명령이지만 Dockerfile을 다시 빌드하면 완전히 새로운 레이어가 생성됩니다. 어떤 노력이 주위에 '추가'더 영리되었습니다 github.com/docker/docker/issues/880 , 비슷한 문제를 다음도 참조 jpetazzo.github.io/2013/12/01/docker-python-pip-requirements을
vaab
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.