Personalize imagens de contentores

As imagens de base pré-configuradas fornecidas pelas estações de trabalho na nuvem contêm apenas um ambiente mínimo com IDE, terminal Linux básico e ferramentas de linguagem, bem como um servidor sshd. Para acelerar a configuração do ambiente de exemplos de utilização de desenvolvimento específicos, pode criar imagens de contentores personalizadas que expandam estas imagens base para pré-instalar ferramentas e dependências, e que executem scripts de automatização.

Para imagens de contentores personalizadas, recomendamos que configure um pipeline para reconstruir automaticamente estas imagens quando a imagem base do Cloud Workstations for atualizada, além de executar uma ferramenta de análise de contentores, como a análise de artefactos, para inspecionar quaisquer dependências adicionais que tenha adicionado. É responsável por manter e atualizar os pacotes e as dependências personalizados adicionados às imagens personalizadas.

Antes de começar

  1. Precisa de uma máquina com ferramentas para criar imagens de contentores, como o Docker, e para enviar imagens para o Artifact Registry através da CLI Google Cloud. Pode usar as Estações de trabalho do Google Cloud ou o Editor do Cloud Shell para realizar estes passos, que têm estas ferramentas pré-instaladas.

  2. Selecione a imagem base que quer usar na nossa lista de imagens base suportadas, como us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest.

    Em alternativa, pode usar a sua própria imagem do contentor ou usar imagens do contentor externas seguindo as instruções para usar a sua própria imagem do contentor.

  3. Crie uma pasta, como CUSTOM_IMAGE_FOLDER, e um ficheiro Dockerfile dentro desta pasta que expanda a imagem de base selecionada, conforme mostrado nos exemplos que se seguem.

Estrutura da imagem base das Cloud Workstations

As imagens base das estações de trabalho na nuvem partilham a seguinte estrutura definida:

  • O ficheiro de ponto de entrada da imagem base está definido como /google/scripts/entrypoint.sh.
  • No arranque, as imagens base executam ficheiros em /etc/workstation-startup.d/* por ordem lexicográfica para inicializar o ambiente da estação de trabalho.

    Os ficheiros e o respetivo comportamento são os seguintes:

    • 000_configure-docker.sh: configura e executa o Docker na estação de trabalho.
    • 010_add-user.sh: cria o utilizador predefinido nas Cloud Workstations.

      Uma vez que o disco persistente é anexado dinamicamente ao contentor, os utilizadores têm de ser adicionados no arranque da estação de trabalho, não no Dockerfile.

    • 020_start-sshd.sh: inicia o serviço sshd no contentor.

    • 030_customize-environment.sh: executa /home/user/.workstation/customize_environment como user.

    • 110_start-$IDE.sh: inicia o IDE para a imagem.

  • O Cloud Workstations armazena imagens Docker no diretório base em /home/.docker_data para que as imagens sejam preservadas entre sessões.

Para adicionar funcionalidades adicionais durante o arranque da estação de trabalho, adicione os seus scripts no diretório /etc/workstation-startup.d/:

  • Por predefinição, os scripts neste diretório são executados como root. Para executar os scripts como um utilizador diferente, use o comando runuser.

  • Como os scripts são executados por ordem lexicográfica, recomendamos que prefixe os scripts com um número de três dígitos superior a 200.

Em alternativa, se não quiser expandir a imagem de uma estação de trabalho, pode criar um script customize_environment no diretório base.

Modificações do diretório inicial

Quando a configuração da estação de trabalho especifica um diretório pessoal persistente (que é o comportamento predefinido), um disco persistente que suporta o diretório pessoal é anexado dinamicamente ao contentor no momento da execução. Este processo substitui as modificações feitas ao diretório /home no momento da compilação da imagem do contentor.

Para preservar as atualizações, modifique o diretório /home no tempo de execução do contentor adicionando um script no diretório /etc/workstation-startup.d ou adicionando a configuração por utilizador no diretório /etc/profile.d. Para acelerar o processo, considere executar o script de configuração como um processo em segundo plano (adicione um sinal de comercial, &, ao final do comando) para evitar o bloqueio do início do contentor.

Seguem-se alguns exemplos de configuração de tempo de compilação que devem ser movidos para o tempo de execução do contentor:

  • Configuração do git por utilizador
  • git repositórios clonados no diretório inicial
  • Configuração direta do utilizador, como colocar ficheiros num diretório $HOME/.config
  • Criação de utilizador

Criação e modificação de utilizadores

Uma vez que o disco persistente é anexado dinamicamente ao contentor no momento da execução, os utilizadores têm de ser adicionados no arranque da estação de trabalho, não no Dockerfile. Para modificar ou criar utilizadores adicionais, recomendamos que atualize /etc/workstation-startup.d/010_add-user.sh ou crie o seu próprio script que é executado no arranque.

Além disso, pode modificar o perfil bash predefinido dos utilizadores atualizando os ficheiros em /etc/profile.d.

Atualize as chaves APT seguras pré-configuradas

As imagens base das estações de trabalho na nuvem vêm pré-instaladas com várias ferramentas obtidas de vários repositórios de terceiros através do APT seguro. Como parte do processo de instalação, as chaves públicas fornecidas pelos proprietários do repositório são importadas através de gpg e colocadas em ficheiros individuais em /usr/share/keyrings/. Estes ficheiros são referenciados a partir dos ficheiros list correspondentes em /etc/apt/sources.list.d/. Isto permite que o apt valide a integridade de um determinado repositório quando interage com ele.

Ocasionalmente, os proprietários de repositórios de terceiros podem decidir alterar a chave pública usada para validar a integridade do respetivo repositório, o que faz com que o apt apresente um erro quando interage com o mesmo. Para resolver este potencial problema, pode usar o /google/scripts/refresh-preinstalled-apt-keys.sh, que obtém as versões mais recentes das chaves públicas pré-instaladas e as importa novamente.

Liste as versões do IDE instaladas

Várias imagens base das estações de trabalho na nuvem são pré-instaladas com um IDE. Para sua conveniência, consulte o script incluído, que apresenta o nome e as informações da versão dos IDEs instalados na imagem./google/scripts/preinstalled-ide-versions.sh

Desative os sudoprivilégios de acesso root

O utilizador predefinido da estação de trabalho tem privilégios de acesso de raiz em sudo destes contentores. Para desativar o acesso de raiz ao contentor do Docker, defina a variável de ambiente CLOUD_WORKSTATIONS_CONFIG_DISABLE_SUDO como true quando criar a configuração da estação de trabalho.

Para definir esta variável de ambiente através da Google Cloud consola quando criar a configuração da estação de trabalho, siga estes passos:

  1. Quando criar a configuração da estação de trabalho, conclua a configuração para as informações básicas e a configuração da máquina.
  2. Na caixa de diálogo Personalização do ambiente, expanda a secção Opções avançadas do contentor e selecione Variáveis de ambiente.
  3. Clique em adicionarAdicionar variável.
  4. Introduza CLOUD_WORKSTATIONS_CONFIG_DISABLE_SUDO e true como o valor.

Personalize sem expandir uma imagem

Para sua conveniência, todas as imagens base do Cloud Workstations verificam a presença de um ficheiro executável localizado em /home/user/.workstation/customize_environment e, se existir, executam-no em segundo plano como user. Isto permite-lhe executar qualquer script ou ficheiro binário no arranque. Ao contrário de .profile ou .bashrc, o script só é executado uma vez quando a estação de trabalho é iniciada, em vez de uma vez para cada início de sessão na shell.

Uma vez que o script customize_environment é executado como user, certifique-se de que atualiza as autorizações conforme necessário quando escrever o script. Por exemplo, se quiser instalar o Emacs sempre que a estação de trabalho for iniciada, o conteúdo de customize_environment pode ser semelhante ao seguinte:

#!/bin/bash
sudo apt-get update
sudo apt-get install -y emacs

Pode encontrar os registos de execução de customize_environment no contentor em /var/log/customize_environment. Estes registos também são escritos nos registos de saída do contentor. Após a execução bem-sucedida de customize_environment, é criado um ficheiro em /var/run/customize_environment_done. Uma vez que o customize_environment é executado em paralelo com o arranque da estação de trabalho, os pacotes instalados pelo script podem ficar disponíveis alguns momentos após o arranque da estação de trabalho.

Use a sua própria imagem de contentor

Também pode usar a sua própria imagem de contentor ou usar imagens de contentores externos, desde que sejam baseadas no Linux e executem um processo de bloqueio quando o contentor é iniciado.

Ao configurar o Dockerfile, a instrução ENTRYPOINT tem de executar um processo de bloqueio, como sleep infinity, para que o contentor continue a ser executado em vez de terminar imediatamente. Em alternativa, na configuração da estação de trabalho, pode definir o campo config.container.args para especificar um processo de bloqueio.

Quando usar a sua própria imagem de contentor, tenha em atenção o seguinte:

  • O Cloud Workstations não requer scripts adicionais da imagem base do Cloud Workstations.

    No entanto, pode consultar os scripts no diretório /etc/workstation-startup.d/ num contentor que execute a imagem base das Cloud Workstations. Os nomes dos ficheiros indicam o que cada script faz.

  • Recomendamos que execute um servidor SSH no contentor. Consulte a secção /etc/workstation-startup.d/020_start-sshd.sh na imagem base predefinida para saber como o Cloud Workstations configura esta opção por predefinição.

  • Recomendamos que execute o IDE ou o servidor Web predefinido na porta 80.

Expanda as imagens base das estações de trabalho na nuvem

Quando expande uma imagem base do Cloud Workstations para criar uma imagem personalizada para o seu ambiente de estação de trabalho, pode adotar três abordagens:

  1. Atualize o ficheiro Dockerfile para incluir quaisquer recursos estáticos adicionais que queira adicionar.
  2. Adicione ficheiros executáveis adicionais em /etc/workstation-startup.d/ para personalizar o contentor em execução. Os ficheiros neste diretório são executados automaticamente por ordem lexicográfica no início do contentor. Por isso, pode adicionar um prefixo ao nome do ficheiro para o executar no momento adequado durante o início da estação de trabalho.
  3. Substitua o ENTRYPOINT no seu Dockerfile para personalizar totalmente o arranque do contentor.

Exemplos de ficheiros Docker personalizados

Esta secção fornece exemplos de cenários e instruções para criar os seus próprios Dockerfiles.

Imagem de contentor com o emacs pré-instalado

Para criar uma imagem de contentor com o emacs pré-instalado, execute os seguintes comandos:

FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest

RUN sudo apt update
RUN sudo apt install -y emacs

Imagem do contentor com personalização do utilizador

Siga estes passos para personalizar uma imagem de contentor:

  1. Crie um script em /etc/workstation-startup.d/* que seja executado após 010_add-user.sh, por exemplo, 011_customize-user.sh:

    #!/bin/bash
    # Create new group
    groupadd $GROUP
    # Add the user to a new group
    usermod -a -G $GROUP $USERNAME
    

    Substitua $GROUP pelo novo nome do grupo e $USERNAME pelo nome de utilizador do utilizador.

  2. Partindo do princípio de que atribuiu o nome 011_customize-user.sh ao seu script, adicione o seguinte à imagem no ficheiro Docker e torne-o executável:

    FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest
    
    COPY 011_customize-user.sh /etc/workstation-startup.d/
    
    RUN chmod +x /etc/workstation-startup.d/011_customize-user.sh
    

Imagem de contentor que define variáveis de ambiente de contentor em sessões SSH

As variáveis de ambiente definidas na configuração da estação de trabalho ou ao nível da estação de trabalho são transmitidas a subprocessos diretos através do comando entrypoint. Isto inclui o IDE nas imagens base pré-configuradas. No entanto, as sessões SSH não são processos secundários do ponto de entrada e não têm estas variáveis de ambiente personalizadas definidas.

Para definir essas variáveis de ambiente nas sessões SSH, configure uma imagem de contentor personalizada que retransmita estas variáveis de ambiente do comando de ponto de entrada do contentor para o ficheiro /etc/environment.

Para o fazer, siga estes passos:

  1. Crie um script em /etc/workstation-startup.d/* que seja executado após 010_add-user.sh, por exemplo, 011_add-ssh-env-variables.sh:

    #!/bin/bash
    #
    echo "CUSTOM_ENV_VAR=$CUSTOM_ENV_VAR" >> /etc/environment
    

    Substitua CUSTOM_ENV_VAR pelo nome da variável de ambiente pretendida.

  2. Partindo do princípio de que atribuiu o nome 011_add-ssh-env-variables.sh ao seu script, adicione o seguinte à imagem no ficheiro Docker e torne-o executável:

    FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest
    
    COPY 011_add-ssh-env-variables.sh /etc/workstation-startup.d/
    
    RUN chmod +x /etc/workstation-startup.d/011_add-ssh-env-variables.sh
    

Imagem de contentor que permite o encaminhamento X11 para sessões SSH

O encaminhamento X11 permite-lhe iniciar aplicações remotas e encaminhar a apresentação da aplicação para uma máquina local.

Para criar uma imagem de contentor que permita o encaminhamento X11, modifique o ficheiro de configuração do daemon OpenSSH (/etc/ssh/sshd_config) fornecido pelas imagens base das Cloud Workstations anexando X11Forwarding yes (para permitir o encaminhamento X11) e AddressFamily inet (para garantir que apenas é usado o IPv4). Para mais informações acerca destas palavras-chave, consulte as páginas Web do OpenBSD sobre AddressFamily e X11Forwarding.

Segue-se um exemplo de um Dockerfile que faz as modificações necessárias:

FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest