리눅스

시놀로지 VMM 을 이용한 도커 멀티빌드

귀신이보인다 2021. 6. 11. 16:06
728x90
반응형

나름 처음 설치하면서 차근차근 하나 하나 입력하면서 혹시몰라 메모를 해두면서 작성하고

 

정리해둔 방법을 설명해보고자 혹은 잊어 먹을까봐 정리하여 올려둡니다.

 

우분투 서버 버젼을 설치합니다.

 

설치 방법은 설명하지 않겠습니다. 도커 이미지가 아닌 VMM 가상머신에서 설치하셔야 합니다.

 

최소 권장 4기가 램 필요...

 

1. 도커 BUILDX 설치
export DOCKER_CLI_EXPERIMENTAL=enabled
export DOCKER_BUILDKIT=1
docker build --platform=local -o . git://github.com/docker/buildx
mkdir -p ~/snap/docker/796/.docker/cli-plugins
cd ~/snap/docker/796/.docker/cli-plugins
wget -O docker-buildx https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64

2. QEMU + BINFMT 설치
apt-get install -y qemu-user-static binfmt-support
qemu-aarch64-static --version
update-binfmts --version

3. 빌더 설치
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx inspect --bootstrap

순서대로 적어 두었습니다.

여기서 빠진것이 있습니다.

1번은 mkdir -p ~/snap/docker/796/.docker/cli-plugins 부분에서 숫자부분이 바뀌는지 모르겠지만 혹시 모르니 확인해보시고 따라해보세요.

아래는 복사 붙여넣기 하시면 됩니다.

파일명은 reregister-qemu-binfmt.sh

#!/bin/bash
# (c) Artur.Klauser@computer.org
#
# This script tries to reregister QEMU's binfmt_misc handlers with the
# fix-binary (F) flag in order to be usable with 'docker buildx' to build
# multi-architecture images.
# For more information see:
# https://nexus.eddiesinentropy.net/2020/01/12/Building-Multi-architecture-Docker-Images-With-Buildx/

function remove_binfmt() {
  local arch="$1"; shift
  local package="$1"; shift
  update-binfmts \
    --package "${package}" \
    --remove "qemu-${arch}" "/usr/bin/qemu-${arch}-static"
}

function install_binfmt() {
  local arch="$1"; shift
  local package="$1"; shift
  local interpreter="$1"; shift
  local offset="$1"; shift
  local magic="$1"; shift
  local mask="$1"; shift
  update-binfmts \
    --package "${package}" \
    --install "qemu-${arch}" "${interpreter}" \
    --offset "${offset}" \
    --magic "${magic}" \
    --mask "${mask}" \
    --credentials yes \
    --fix-binary yes
}

function reregister_qemu_binfmt() {
  # Reregister all qemu interpreters with fix-binary flag which makes them
  # available inside containers and chroots, e.g. docker buildx works for
  # architectures supported by qemu interpreters.
  for file in /proc/sys/fs/binfmt_misc/qemu-*; do
    arch="${file/*qemu-/}"
    package="$(head -1 "/var/lib/binfmts/qemu-${arch}")"
    # Pull arguments from current registration.
    eval $(awk ' \
      /^(interpreter|offset|magic|mask)/ {printf "%s=\"%s\"\n",$1,$2}' \
      "${file}")
    # Convert to binary strings.
    magic="$(echo $magic | sed 's/\(..\)/\\x\1/g')"
    mask="$(echo $mask | sed 's/\(..\)/\\x\1/g')"
    echo "Reregistering arch $arch"
    remove_binfmt "${arch}" "${package}"
    install_binfmt "${arch}" "${package}" "${interpreter}" \
      "${offset}" "${magic}" "${mask}"
  done
}

set -e
reregister_qemu_binfmt "$@"

check-qemu-binfmt.sh

#!/bin/bash
# (c) Artur.Klauser@computer.org
#
# This script checks if all software requirements are met in a Linux environment
# in order to use 'docker buildx' to build multi-architecture images.
# For more information see:
# https://nexus.eddiesinentropy.net/2020/01/12/Building-Multi-architecture-Docker-Images-With-Buildx/

function error() {
  echo "ERROR: $*"
  exit 1
}

function ok() {
  echo "OK: $*"
}

function version() {
  printf '%02d' $(echo "$1" | tr . ' ' | sed -e 's/ 0*/ /g') 2>/dev/null
}

function check_qemu_binfmt() {
  # Docker
  if ! command -v docker >/dev/null 2>&1; then
    error "Can't find docker." \
	 "Install with 'sudo apt-get install docker-ce' or docker.io."
  fi
  docker_version="$(docker --version | cut -d' ' -f3 | tr -cd '0-9.')"
  if [[ "$(version "$docker_version")" < "$(version '19.03')" ]]; then
    error "docker $docker_version too old. Need >= 19.03"
  fi
  docker_experimental="$(docker version | \
                         awk '/^ *Experimental:/ {print $2 ; exit}')"
  if [[ "$docker_experimental" != 'true' ]]; then
    error "docker experimental flag not enabled:"\
          "Set with 'export DOCKER_CLI_EXPERIMENTAL=enabled'"
  else
    ok "docker $docker_version supports buildx experimental feature."
  fi

  # Kernel
  kernel_version="$(uname -r)"
  if [[ "$(version "$kernel_version")" < "$(version '4.8')" ]]; then
    error "Kernel $kernel_version too old - need >= 4.8." \
          " Install a newer kernel."
  else
    ok "kernel $kernel_version has binfmt_misc fix-binary (F) support."
  fi

  # binfmt_misc file system
  if [[ "$(mount | grep -c '/proc/sys/fs/binfmt_misc')" == '0' ]]; then
    error '/proc/sys/fs/binfmt_misc not mounted. Mount with' \
	  "'sudo mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc'"
  else
    ok "/proc/sys/fs/binfmt_misc is mounted"
  fi

  # binfmt-support
  if ! command -v update-binfmts >/dev/null 2>&1; then
    error "Can't find update-binfmts." \
	 "Install with 'sudo apt-get install binfmt-support'."
  fi
  binfmt_version="$(update-binfmts --version | awk '{print $NF}')"
  if [[ "$(version "$binfmt_version")" < "$(version '2.1.7')" ]]; then
    error "update-binfmts $binfmt_version too old. Need >= 2.1.7"
  else
    ok "update-binfmts $binfmt_version has fix-binary (F) support."
  fi

  # QEMU
  if [[ ! -e '/proc/sys/fs/binfmt_misc/qemu-aarch64' ]]; then
    # Skip this test if QEMU isn't registered with binfmt_misc. It might
    # come from a docker image rather than the host file system.
    if [[ ! -e '/usr/bin/qemu-aarch64-static' ]]; then
      error "Missing QEMU." \
            " Install with 'sudo apt-get install qemu-user-static'."
    else
      ok "QEMU installed"
    fi
  fi

  if [[ ! -e '/proc/sys/fs/binfmt_misc/qemu-aarch64' ]]; then
    error 'QEMU not registered in binfmt_misc.'
  fi
  flags="$(grep 'flags:' /proc/sys/fs/binfmt_misc/qemu-aarch64 | \
	   cut -d' ' -f2)"
  if [[ "$(echo "$flags" | grep -c F)" == '0' ]]; then
    error 'QEMU not registered in binfmt_misc with fix-binary (F) flag.'
  else
    ok "QEMU registered in binfmt_misc with flags $flags (F is required)."
  fi

  echo "Host looks good for docker buildx multi-architecture support".
}

set -e
check_qemu_binfmt "$@"

이후 snap restart docker 혹은 snap stop docker && snap start docker

docker buildx ls

하시게 되면 

root@dockerbuildx:~# docker buildx ls
NAME/NODE    DRIVER/ENDPOINT             STATUS  PLATFORMS
mybuilder *  docker-container
  mybuilder0 unix:///var/run/docker.sock running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/386, linux/arm/v7, linux/arm/v6, linux/s390x
default      docker
  default    default                     running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

 위와 같이 나오셔야 정상입니다.

위와 같이 나오지 않으면 dpkg 에러를 내뱉어내면서 제가 왜 않되는지 고생했던 기억이 납니다 ㅎㅎㅎ

일단 여기까지 멀티 아키텍처 빌드는 성공했습니다.

728x90
반응형