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 .
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 tcnksm
para 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.rb
spec_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 tcnksm
para 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 git
falhará 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 git
instalaçã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 .