Problema com inodes de 64 bits (host) versus inodes de 32 bits em osxfs no container Ubuntu 16.04

1

Eu tenho um problema que estou procurando para obter algum feedback sobre a maneira correta de "docker" para resolver. Eu acredito que este é Docker para Mac específico por causa do fato de montagens de ligação usam osxfs e os inodes são de 64 bits, não 32 bits. Ao contrário dos sistemas de arquivos como cifs que permitem o uso de ‘noserverino’, os ossxfs não parecem ter uma maneira de permitir que o cliente determine inodes em vez do sistema montado.

Eu criei uma imagem docker básica baseada no Ubuntu 16.04

    FROM ubuntu:16.04@sha256:ea1d854d38be82f54d39efe2c67000bed1b03348bcc2f3dc094f260855dff368

    RUN dpkg --add-architecture i386
    RUN apt-get update && apt-get install -y \
      bzip2 \
      expect \
      file \
      gtk2-engines-murrine:i386 \
      libgtk2.0-0:i386 \
      libxtst6:i386 \
      lib32stdc++6 \
      libxt6:i386 \
      libdbus-glib-1-2:i386 \
      libasound2:i386 \
      make \
      maven \
      openjdk-8-jdk \
      patch \
      python \
      rsync \
      swig \
      unzip \
      vim \
      wget \
      && rm -rf /var/lib/apt/lists/*

O propósito desta imagem é para o servidor como um ambiente de construção comum para desenvolvedores. Ele também inclui um compilador comercial para um dispositivo incorporado de 32 bits mais antigo. Para os fins desta explicação, a imagem do docker é denominada "crosscompiler"

O uso do Ubuntu (16.04 especificamente) não tem sido um problema para os desenvolvedores em uma forma de máquina virtual, mas os muitos benefícios do Docker superam a abordagem de VM. Portanto, esta imagem do Docker é substituir a VM.

Então o PROBLEMA: Como o compilador cruzado é um conjunto de ferramentas de 32 bits, ele conta com bibliotecas i386 a serem incluídas, que incluímos no Dockerfile acima.

Para usar essa imagem para compilar código, podemos executar algo como o seguinte:

docker run --rm -ti --volume=/path/to/source/code/to/build:/root/workspace crosscompiler /bin/sh -c “cd /root/workspace && ./build.sh”

build.sh executa um script que cria todo o código. A questão é que, porque este é um compilador cruzado de 32 bits que faz coisas como stat (que em nosso compilador mais antigo não tem suporte para arquivos grandes, ou seja, inodes de 64 bits). Quando o contêiner do Ubuntu monta o diretório hosts contendo o código-fonte, os inodes são todos de 64 bits e o GNU Tools de 32 bits vê esses arquivos como Value too large for defined data type . Atualmente, eu não sei de nenhuma maneira de dizer osxfs (ou seja, o compartilhamento do sistema de arquivos macOS usado com Docker para Mac).

Qual seria o caminho sugerido para resolver algo assim?

  • Copiar nossa fonte para o contêiner que é criado a cada vez?
  • De alguma forma, usar o Docker "Volumes" para que o contêiner construa os arquivos em si?
  • Alguma maneira de configurar uma montagem do tipo "noserverino" para osxfs?
  • Outras opções?

O objetivo aqui é permitir que as alterações no código-fonte local no host sejam facilmente compiladas no contêiner. Isso será usado localmente ou em um ambiente de Construção Contínua, então é vantajoso criar uma solução elegante e sustentável.

    
por Adam H 06.07.2018 / 16:15

0 respostas