docker를 사용하여 chroot를 빌드하는 방법은 무엇입니까?

docker를 사용하여 chroot를 빌드하는 방법은 무엇입니까?

현재 개발 컴퓨터에서 Ubuntu 18.04 32비트 chroot를 빌드할 수 있습니다. Docker 컨테이너 내에서 프로세스를 수행할 수 있는지 알고 싶습니다.

내가 사용하는 프로세스:

  • 우분투 기본 이미지 압축 풀기( ubuntu-base-18.04.3-base-i386.tar.gz)
  • resolve.conf호스트에서 압축이 풀린 파일 시스템으로 파일 복사
  • 설치 /sys/proc/dev
  • chroot /location/of/filesystem /bin/bashchroot로 실행 하고 추가 설정을 실행하세요.
  • 완료되면 모든 것을 제거하고 /location/of/filesystem.

Docker 컨테이너 내에서도 동일한 방법을 수행할 수 있습니까?

Docker 컨테이너 내에서 파일을 마운트/마운트 해제할 수 있는 방법에 대해서는 아무것도 표시되지 않습니다.

답변1

처음에 겪었던 문제는 chroot를 생성하기 위해 docker 컨테이너에서 실행되는 스크립트를 작성하는 방법에 있었던 것 같습니다.

Docker 컨테이너에서 32비트 chroot를 생성할 수 있습니다.권한 있는 컨테이너를 실행해야 합니다.그렇지 않으면 필요한 디렉토리/파일 시스템(예: /proc)을 chroot에 마운트할 수 없습니다(그리고 오류가 발생합니다).

내가 사용한 단계를 약간 수정해야 했습니다.

  • 내가 사용하는 docker 명령은 다음과 같습니다. docker run -t --rm --name "chrootTest" -v $(pwd):/root/<CHROOT_SCRIPT_DIR> --privileged --workdir /root/<CHROOT_SCRIPT_DIR> <IMAGE>:<TAG> ./build-chroot.sh <CHROOT_DIR_LOCATION>
  • /dev마운트 하거나 chroot 할 필요가 없습니다 /sys. (수정 사항에는 디렉터리/파일/symlink 제거 및 apt-get install일부 종속성 지정이 포함됩니다. 이러한 작업 만 마운트하면 되었지만 /proc, 다른 작업을 수행하는 경우 다른 디렉터리를 마운트해야 할 수도 있습니다.)
  • 스크립트는 아카이브를 추출하여 호스트에서 추출된 파일 시스템으로 <CHROOT_DIR_LOCATION>복사하는 resolve.conf동시에 설치에 필요한 디렉터리도 생성합니다.
  • 그런 다음 chroot로 이동하여 필요한 설정을 수행하는 heredoc이 있습니다. chroot "$CHROOT_DIR_LOCATION" /bin/bash <<'EOF' ... EOF
  • 설정이 완료되면 tarchroot 파일 시스템을 시작하고 workdir을 삭제하고 <CHROOT_DIR_LOCATION>스크립트가 종료되고 docker 컨테이너가 삭제되었습니다.

볼륨 마운트로 인해 새로 생성된 chroot가 포함된 tar 아카이브가 docker 명령을 실행하는 호스트에 여전히 존재합니다.

답변2

나는 docker를 사용하여 Ubuntu 설치 프로그램 Live CD를 변경합니다. 여기에는 환경 casper/filesystem.squashfs과 같은 것이 포함됩니다 chroot. 즉, 설치 프로세스 중에 대상 파일 시스템에 기록되는 완전한 루트 파일 시스템입니다. 다음과 같이 변경합니다 filesystem.squashfs.

# extract installer iso
$ osirrox -indev ubuntu-18.04.4-desktop-amd64.iso -extract ./ ./ubuntu-18.04.4-desktop-amd64.d

# extract filesystem squashfs
$ unsquashfs ubuntu-18.04.4-desktop-amd64.d/casper/filesystem.squashfs

# create filesystem tarball
$ tar -cf squashfs-root.tar -C squashfs-root .

# create docker image 
$ docker image import squashfs-root.tar squashfs-root:latest

# create docker container, make changes inside
$ docker run --name squashfs-mine squashfs-root sh -c 'touch /etc/my.conf'

이 시점에서 이제 중지된 컨테이너에는 squashfs-mine원래 파일 시스템과 그 안의 파일이 포함됩니다 . 이제 컨테이너의 파일 시스템을 tar로 보관할 run수 있습니다 .export

# extract filesystem tarball
$ docker export -o squashfs-mine.tar squashfs-mine

filesystem.squashfs제 경우에는 원본 *.iso콘텐츠 내에 새 콘텐츠를 생성하고 다시 패키징하고 싶습니다 *.iso.

# populate filesystem directory
$ tar -xf squashfs-mine.tar --one-top-level

# create filesystem squashfs
$ mksquashfs squashfs-mine ubuntu-18.04.4-desktop-amd64.d/casper/filesystem.squashfs

# re-pack iso
$ xorriso -as mkisofs ... -o ubuntu-18.04.4-desktop-amd64.iso ubuntu-18.04.4-desktop-amd64.d

...하지만 요구 사항은 다를 수 있습니다.

관련 정보