Configuração do Docker


As nossas várias ferramentas de track são publicadas como imagens Docker.

Cada ferramenta exige um Dockerfile, que especifica como a máquina é construída. Deve ficar no diretório raiz do teu repositório e deve chamar-se Dockerfile.

O Dockerfile deve criar a imagem mínima necessária para que as ferramentas funcionem corretamente e com rapidez. A nossa página de Boas Práticas tem muitas dicas para te ajudar a alcançar esse objetivo.

Execução

Timeouts

O test runner tem 100% de CPU com 3GB de memória durante uma janela de 20 segundos por solução. Após 20 segundos, o processo é interrompido e reporta um timeout com o código de erro 408.

Note

Recomendamos vivamente que sigas o nosso documento de Boas Práticas de Desempenho para reduzir a probabilidade de timeouts.

Stdout/stderr

Uma execução das ferramentas pode produzir, no máximo, um megabyte de stdout e stderr. Se produzir mais, será terminada com o código de erro 413.

O conteúdo de stdout e stderr de cada execução será guardado em ficheiros. Podes escrever um ficheiro results.out no diretório de saída, que contém informação de depuração.

Caution

Neste momento, não é possível que os responsáveis pela manutenção vejam o conteúdo destes ficheiros.

Resultados

O ficheiro de resultados não pode ter mais de 500 kilobytes (incluindo quaisquer stack traces, etc.). Se o ficheiro for maior do que isto, a execução das ferramentas será terminada com o código de erro 460.

Configuração

Cada solução recebe 100% dos recursos da máquina durante uma janela de vinte segundos. Após 20 segundos, o processo é interrompido e a execução é assinalada como um timeout.

Algumas ferramentas exigem (pequenos) desvios à configuração predefinida. Nesse caso, são configuradas no ficheiro tools.json do repositório Tooling Invoker.

Rede

As ferramentas são executadas sem acesso à internet. Podes usar duas configurações diferentes:

  1. none. Desativa o dispositivo de rede dentro do contentor.
  2. internal. Adiciona um dispositivo de rede dentro do contentor, mas a rede não tem acesso a nada externo.

Linguagens diferentes têm um desempenho melhor ou pior consoante a configuração (por exemplo, o Ruby é 2x mais rápido com none. O Elixir é 12x mais rápido com internal.

Podes experimentar localmente usando a opção --network ao executar o teu docker. --network none é suportado por predefinição. Para usar a rede interna, executa primeiro docker network create --internal internal para criar a rede e depois usa --network internal ao executar o contentor.

Memória

As linguagens podem definir a memória máxima que precisam de usar para executar as suas tarefas. Definir este valor o mais baixo possível permite-nos executar mais tarefas em paralelo e mais depressa. Também significa que quem tente abusar da memória não vai conseguir. Linguagens diferentes precisam de valores de memória máxima radicalmente diferentes. É aconselhável, e agradecemos, que avalies o desempenho da execução de um docker run para determinar a memória máxima que utiliza.

A memória deve ser especificada através do número com o sufixo b, k, m ou g, para indicar bytes, kilobytes, megabytes ou gigabytes.

Executar o Docker localmente

Podes testar as definições acima com este comando:

docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/

Editar um Dockerfile

Todas as alterações a Dockerfiles exigem uma revisão de PR por parte da equipa @exercism/maintainers-admin, para evitar a introdução de vulnerabilidades de segurança.