docker image를 만들거나 live USB를 만들기 위해 시스템 전체를 tar 할 때

stephen.kim의 이미지

잘 돌아가는 임의의 리눅스 시스템(꼭 데비안이나 레드햇 같이 이런 작업을 해주는 툴이 있지는 않은 걸로 아는)의 snapshot을 떠서 base docker image를 만들고자 합니다. 비슷한 질문이 아래 있던데 대답이 없어서 질문을 좀더 구체적으로 만들어 보겠습니다.

docker image는 비어 있는 루트 파일 시스템에다 압축을 풀 tar 파일이 있으면 쉽게 만들 수 있는 것 같습니다. 사실 모든 base image (예컨대 Debian, Ubuntu, Gentoo 이런 것들)는 그렇게 만들 수밖에 없어 보이고요.

보아하니 Live CD/USB에서 새로운 시스템에 리눅스를 설치할 때에도 대략 다음 과정들을 거치는 것 같습니다.

(1) 돌아가는 시스템에서 root file system의 주요 내용들 (bin, usr, var, lib, 등)을 tar 해뒀다가 새 시스템의 빈 루트 파티션에 카피
(2) 필요하면 새 파티션으로 chroot해서 환경마다 고유할 수밖에 없는 기본 설정들을 해줌
- fstab이 대표적인 예겠고, 네트워크 설정, 커널 컴파일 & 인스톨, 부트로더 설정 및 설치 등

이때도 돌아가는, 레퍼런스 시스템의 루트 파일 시스템을 카피할 것 같은데, 이 카피본을 tar로 만든다고 가정하겠습니다.

그 경우에 어떤 디렉토리를 제외해야 하나요? proc, sys, dev, boot를 제외할 것 같은데 맞나요?

또 tar를 아마도 root로 수행하게 될 텐데, 이 경우 owner, group, mode 등 기본 속성은 물론 심볼릭 링크, 하드 링크, 그외 커널 컴파일 때 보긴 했는데 잘 모르는 file attribute 등이 tar 옵션에 따라 깨질 수도 있을 것 같습니다. 되도록 안 깨지려면 어떤 tar 옵션을 사용해야 하나요?

감사합니다.

jick의 이미지

(답변이 아니라서 죄송합니다.)

경우에 따라서 꼭 그럴 수밖에 없는 사정이 있을 수도 있지만... 필요한 패키지가 뭐고 돌려야 할 스크립트가 뭔지 확인한 다음 (예를 들면) ubuntu base image를 기본으로 Dockerfile에 apt-get 등등등을 돌려서 docker 이미지를 만드는 쪽이 앞으로 삽질을 대단히 절약할 수 있을 것 같습니다만...

그냥 "현재 돌아가는 시스템"을 떠서 이미지를 만들면, 예를 들어서 우분투라면 아무리 늦어도 5년 뒤에는 새 버전으로 업그레이드를 해야 하는데 그때 가서는 어떻게 하시려구요?

stephen.kim의 이미지

생각해 보니 레드햇이나 우분투 같은 시스템은, 그러니까 일반적으로는 이 접근법이 좋지 않겠네요.

제가 이 질문을 하게 됐던 것은 제가 Gentoo 사용자라서 같습니다. 어떤 소프트웨어를 어떻게 설치할 건지 가이드 하는 게 make.conf나 package.* 같은 파일인데 그것만 카피해다가 처음부터 패키지 매니저로 빌드하면 되는 경우보다 안 되는 경우가 더 많거든요.

Redhat은 예컨대 golang-1.9.4-2.el7 이라는 패키지에 이미 한 가지 configuration이 결정되어 들어가게 되는 것 같습니다. 따라서 패키지 간의 의존관계가 상대적으로 단순하고요. Gentoo는 각 패키지 버전 별로 USE flag라는, 선택 가능한 configuration option들이 주어집니다. 예컨대 gccgo를 켜고 빌드하거나 끄고 빌드할 수가 있습니다.

문제는 예컨대 gnome을 지원한다고 거칠게 말할 때, 그 의미가 패키지 별로 다르기도 하고 해선지, 꼭 꼬일 때가 있습니다. 예컨대 A, B, C 모두 gnome을 지원해서 빌드하고 싶더라도 처음에는 A는 gnome을 빼고 빌드한 다음에 A, B, C가 모두 설치되면 A에 다시 gnome을 넣어 업데이트 빌드를 해야 되거나 하는 경우가 생기더군요.

이 과정이 기록으로 보통 남아 있지 않아서 각각의 패키지를 어떤 옵션으로 빌드할지 지시하는 것만으로는 베이스 이미지 위에서 재현하기 힘듭니다.

그리고 또 하나의 문제는 gentoo는 OS version이라는 개념이 없다 보니 제가 사용했던 베이스와 같은 베이스 이미지가 젠투에서 퍼블리쉬 되지 않고요. 그래서 개인적으로는 이 젠투 이미지를 지금 빌드하면 앞으로는 우분투를 대충 설치해도 그 위에 개발 환경을 쉽게 올리고 훨씬 덜 삽질해서 젠투를 쓸 수 있고요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.