TDD para Dockerfile por RSpec (severspec)

Eu escrevi alguns Dockerfiles. Agora o Dockerfile que criei é muito simples, mas posso ficar inquieto quando o Dockerfile se tornar mais longo e complexo. Para remover essa ansiedade, devemos escrever TESTE para ele. Se pudermos construir o Dockerfile com o processo TDD, é ótimo!

Há um ótimo post sobre TDD para Dockerfile, “Experimentando com desenvolvimento dirigido por teste para docker” por PIETER JOOST VAN DE SANDE. Ele tentou testar o Dockerfile pela API Docker . É bom, mas não pode testar a confirmação da instalação do pacote. Eu tentei com o serverspec de Gosuke Miyashita .

tcnksm / docker-rspec

Com serverspec, você pode escrever testes RSpec para verificar se seus servidores estão configurados corretamente ou não. Ele é usado com ferramentas de gerenciamento de configuração como Pupet ou Chef. Eu o apliquei para testar o Dockerfile.

Preparação (ssh e sudoer)

Para usar o serverspec, precisamos preparar o usuário de login ssh para o docker container e sudoer. Prepare o Dockerfile abaixo para atender a essas condições.

FROM ubuntu

# Install ssh
RUN apt
-get update
RUN apt
-get install -y openssh-server

# Setting ssh
RUN mkdir
/var/run/sshd
RUN
/usr/sbin/sshd
CMD
["/usr/sbin/sshd", "-D"]

# Create user and set sudo password
RUN useradd tcnksm

RUN echo tcnksm
:**** | chpasswd

# Setting ssh login without sudo
RUN mkdir
-p /home/tcnksm/.ssh
RUN chown tcnksm
/home/tcnksm/.ssh
RUN chmod
700 /home/tcnksm/.ssh
ADD
./id_rsa.pub /home/tcnksm/.ssh/authorized_keys
RUN chown tcnksm
/home/tcnksm/.ssh/authorized_keys
RUN chmod
700 /home/tcnksm/.ssh/authorized_keys

# Setting sudoers
RUN echo
"tcnksm ALL=(ALL) ALL" > /etc/sudoers.d/tcnksm

Você pode adicionar sua senha em **** e alterar o nome tcnksmpara o seu nome. E você precisa preparar seu diretório atual.id_rsa.pub

Crie uma imagem e execute o contêiner.

$ docker build -t tcnksm/sample .
$ docker run
-p :22 -d tcnksm/sample /usr/sbin/sshd -D

Preparação (serverpec)

Instalação de serverspec

$ gem install 'serverspec'

Após a instalação, configure-o.

$ serverspec-init
Select OS type:

1) UN*X
2) Windows

Select number: 1

Select a backend type:

1) SSH
2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: 192.168.50.4

Presumo que o docker seja executado no host.192.168.50.4

Agora um teste rspec de amostra é gerado. Nesse caso, use o padrão .spec_helper.rbspec_helper.rb

Configuração ~/.ssh/config

Host 192.168.50.4
HostName 192.168.50.4
User tcnksm
Port 7654
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/tcnksm/.ssh/id_rsa
IdentitiesOnly yes
LogLevel FATAL

Você deve mudar tcnksmpara seu nome de usuário ssh.

E configure a variável de ambiente da senha sudoer no contêiner do docker que você adicionou no Dockerfile.

$ export SUDO_PASSWORD="****"

Teste de Escrita

Agora a configuração está concluída. Vamos escrever o teste. Por exemplo, teste de gravação confirmando que o comando git está instalado.

# spec/192.168.50.4/git_spec.rb
require 'spec_helper'

describe
package('git') do
it
{ should be_installed }
end

Executar teste (vermelho)

O teste gitfalhará porque não está instalado no contêiner docekr.

$ rspec
F


Failures:

1) Package "git" should be installed
Failure/Error: it { should be_installed }
sudo dpkg
-query -f '${Status}' -W git | grep '^install ok installed$'

dpkg
-query: no packages found matching git
expected
Package "git" to be installed
# ./spec/192.168.50.4/git_spec.rb:4:in `block (2 levels) in <top (required)>'

Finished in 0.90756 seconds
1 examples, 1 failure

Escreva Dockerfile

Adicione a gitinstalação ao Dokcerfile.

RUN apt-get install -y git

Crie e execute o contêiner novamente com o comando acima.

Executar teste (verde)

Este teste de tempo deve ser aprovado.

$ rspec
.

Finished in 0.90842 seconds
1 examples, 0 failures

Conclusão

Isso é fácil. Podemos testar a instalação do pacote pelo Dockerfile. Com serversepc e Docker API, quase podemos testar o
Dockerfile que criamos. Com serverspec, podemos confirmar o estado do servidor mais complexo. Para mais detalhes, consulte o documento oficial .