testing strategies for docker containers
TRANSCRIPT
About me…•DT @HPE
•github.com/alexei-led/pumba
•#docker, #golang, #aws
•medium.com/@alexeiled
•@alexeiled
Demo App & Test• Demo App
• Rest API server
• #golang
• Test
• Newman
• Postman scenario file
• #nodejs
#builddemoapp$gobuild-o.dist/demo-v
#runappandtests$.dist/demo&>/dev/null&$newmanrun-etest/local.env.jsondemo-rest-api-tests.postman.json
#buildDockerdemoimage$dockerbuild-tdemo-fdocker/Dockerfile.dist.
https://asciinema.org/a/100204
Benefits and Drawbacks• Familiar CI flow
• Application portability
• Smaller Docker image
• Non portable DEV environment
• Non portable TEST environment
#builddemoapp&testcontainer$dockerbuild-tdemo:apptest-fdocker/Dockerfile.build.apptest.
#runtests$dockerrun-it--rmdemo:apptestscript/test.sh
#runapp$dockerrun-d-p10000:10000demo:apptestdemo
https://asciinema.org/a/100216
Benefits and Drawbacks• Application portability
• Portable DEV environment
• Portable TEST environment
• Bigger Docker image size
• Need to rebuild the whole image on code or test change
• Polluted Docker image
• Need to manage test results
#buildtestawareDockerimage$dockerbuild-tdemo:testaware-fdocker/Dockerfile.build.testaware.
#runtests$dockerrun-it--rmdemo:testaware
#getapplayersfromimage$APP_LAYER=$(dockerhistorydemo:testaware|\grep-e“LABELSPLIT=T”|\awk‘{print$1}’)
#tagAPP_LAYERandpushit$dockertag$APP_LAYERdemo:app
#rundemoapp$dockerrun-it—rm-p10000:10000demo:app
https://asciinema.org/a/100260
Benefits and Drawbacks• Application portability
• Portable TEST and DEV environments
• 2 separate images
• One Dockerfile
• Need to rebuild the whole image on code or test change
• Need some shell “magic” to create a clean APP image (non-Docker way)
Docker Automation Flow• Docker automation CI/CD flow consists from multiple steps, like: build, scan, test,
run, deploy and others.
• Each step requires different tools, runtime, packages, data and configuration files
• Use dedicated Docker container for every step
• For example:
• Builder Container - use it to build your app. Docker container with compilers, linters, package managers and other dev tool.
• Test Container(s) - user it to test your app. Docker container with testing tools, test scripts, runtimes and helper files and required packages.
• App Container - the one you push/deploy. Docker container with application binary, runtime and required packages only.
#buildBuildContainerimage$dockerbuild-tdemo:builder-fdocker/Dockerfile.builder.
#useBuildercontainertobuildtheapp$dockerrun-it--rm\-v$(pwd)/.dist:/go/src/app/.dist\-eCGO_ENABLED=0demo/buildergobuild-v-o.dist/demo
#buildAppContainerimage$dockerbuild-tdemo:dist-fdocker/Dockerfile.dist.
#buildTestContainerimage$dockerbuild-tdemo:test-fdocker/Dockerfile.test.
#createcommonnetworkforappandtest$dockernetworkcreatemynet
#rundemoapp$dockerrun-d--namedemo--networkmynetdemo:dist
#runtests$dockerrun-d--nametests--networkmynetdemo:test\newmanrun-etest/demo.env.json\test/demo-rest-api-tests.postman.json
Benefits and Drawbacks• Application portability • Portable DEV environment
• Build ANYWHERE • Portable TEST environment
• Test ANYWHERE • Small APP image • Fast builds
• Need an approach/tool to automate and orchestrate Docker build flow • Bash, Ansible, etc. • Docker CI/CD service, like
codefresh.io