SlideShare a Scribd company logo
1 of 75
Download to read offline
Alexander Akbashev
RootConf | June 06, 2017
Docker in Continuous
Integration
Agenda
• Context
• Very naive time
• Start Project Docker
• Something went wrong
• Chaos
• Still not perfect
• New day - new challenges
• Monitoring
• Morale
Context
What does CI System mean
for us
Context
• Self-hosted Jenkins
• Cloud based + target hardware in the labs
• Tons of configured project
• All changes are going through pre-commit
validation pipelines
• Different platform and different products
• Our users are our colleagues
Day 0
Very naive time
Everything was so simple… to break
Mutable host
- Yes, I really want to change /etc/
hosts for my integration test
- …
One agent - one package
You don’t want to mix some stuff
on one host
• one version of python
• one version of system library
• one version of everything
New package - new pain
- Oops, I didn’t know that
libXYZ-1.2 comes with new API
compare to libXYZ-1.1
Painful verification process
To test new package you need:
• new node
• new label
• cloned job (multiple jobs?)
• … but it’s used in 100+ projects…
Bad utilization
Some nodes are needed only in
rare cases
I want to test only on CentOS 5! It’s
my favourite production OS!
Download to build
Java, Python, Ruby, nodeJs tends
to download staff on-the-fly
External dependency
It’s not safe to query Internet in
pre-commit
> Could not resolve commons-io:commons-io:2.4.
> Could not get resource https://jcenter.bintray.com/commons-
io/commons-io/2.4/commons-io-2.4.pom
> Received status code 500 from server: Internal Server Error
Day 0
Start Project Docker!
Docker is so awesome!
• We can control docker content
• CI builds are reproducible locally
• Tests do not affect each other
• We can cache stuff in docker
Docker
Small intro
Definition
Docker provides isolated user
space
Dockerfile
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get -y install 
gcc ccache cppcheck
docker build
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu:16.04
---> f49eec89601e
Step 2/3 : RUN apt-get update
---> Running in c469408dd82f
---> 3964096123fa
Removing intermediate container c469408dd82f
Step 3/3 : RUN apt-get -y install g++ ccache cppcheck
---> Running in dc0e107be645
Removing intermediate container dc0e107be645
Successfully built 06f880788e38
docker build
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu:16.04
---> f49eec89601e
Step 2/3 : RUN apt-get update
---> Running in c469408dd82f
---> 3964096123fa
Removing intermediate container c469408dd82f
Step 3/3 : RUN apt-get -y install g++ ccache cppcheck
---> Running in dc0e107be645
Removing intermediate container dc0e107be645
Successfully built 06f880788e38
docker image history
IMAGE CREATED (ago) CREATED BY SIZE
06f880788e38 6 minutes apt-get -y install gcc… 153MB
3964096123fa 7 minutes apt-get update 40MB
<missing> 4 months mkdir -p /run/... 7B
<missing> 4 months sed -i ’s/^... 1.9kB
<missing> 4 months set -xe &... 745B
<missing> 4 months (nop) ADD file 68f83d96c… 129MB
docker image history
IMAGE CREATED (ago) CREATED BY SIZE
06f880788e38 6 minutes apt-get -y install gcc… 153MB
3964096123fa 7 minutes apt-get update 40MB
<missing> 4 months mkdir -p /run/... 7B
<missing> 4 months sed -i ’s/^... 1.9kB
<missing> 4 months set -xe &... 745B
<missing> 4 months (nop) ADD file 68f83d96c… 129MB
docker image history
IMAGE CREATED (ago) CREATED BY SIZE
06f880788e38 6 minutes apt-get -y install gcc… 153MB
3964096123fa 7 minutes apt-get update 40MB
<missing> 4 months mkdir -p /run/... 7B
<missing> 4 months sed -i ’s/^... 1.9kB
<missing> 4 months set -xe &... 745B
<missing> 4 months (nop) ADD file 68f83d96c… 129MB
docker image history
IMAGE CREATED (ago) CREATED BY SIZE
06f880788e38 6 minutes apt-get -y install gcc… 153MB
3964096123fa 7 minutes apt-get update 40MB
<missing> 4 months mkdir -p /run/... 7B
<missing> 4 months sed -i ’s/^... 1.9kB
<missing> 4 months set -xe &... 745B
<missing> 4 months (nop) ADD file 68f83d96c… 129MB
docker image history
IMAGE CREATED (ago) CREATED BY SIZE
17534b008d4e 10 seconds apt-get update && apt-ge… 153MB
<missing> 4 months mkdir -p /run/... 7B
<missing> 4 months sed -i ’s/^... 1.9kB
<missing> 4 months set -xe &... 745B
<missing> 4 months (nop) ADD file 68f83d96c… 129MB
docker push
uploads image to central storage:
• DockerHub
• Artifactory
• AWS ECR
• default
docker pull
verifies that image is up-to-date
download layers
extract layers
docker run
pulls if image doesn’t exist
executes command in container
Day 1
Something went wrong
Our expectations didn’t meet reality
New image - new pain
docker pull my_product:latest
docker pull test:latest
sha256:12d30ce421ad530494d588f87b2328ddc3ca
Status: Downloaded newer image for test:latest
New image - new pain
docker pull my_product:latest
docker pull test:latest
sha256:12d30ce421ad530494d588f87b2328ddc3ca
Status: Downloaded newer image for test:latest
docker pull test:latest
sha256:01a21daf124543213d1a0514523612345198
Status: Downloaded newer image for test:latest
New image - new pain
docker pull my_product:latest
docker pull test:latest
sha256:12d30ce421ad530494d588f87b2328ddc3ca
Status: Downloaded newer image for test:latest
docker pull test:latest
sha256:01a21daf124543213d1a0514523612345198
Status: Downloaded newer image for test:latest
Testing new images in pre-commit
• tag as a version number
• versioning is mandatory (no
“latest” anymore!)
• overrides are not allowed
• actual version is defined in config
file (pre-submit testable now)
Timeouts
“docker pull” times out
docker pull my_image:1.0
b6f892: Downloading [===========> ] XX MB/YY MB
55010f: Downloading [============> ] XX MB/YY MB
2955fb: Downloading [=============> ] XX MB/YY MB
Timeouts
New feature in Timeout Plugin ->
Step with timeout
All images are backed in AMI itself
Docker stucks
--rm doesn’t guarantee much
docker run ——rm my_image:1.0 do_work.sh
Docker stucks: trap for docker!
Add trap for $DOCKER_TAG
trap "{
docker ps -aq --filter name=$BUILD_TAG |
xargs --no-run-if-empty docker rm -f --volumes ||
true;
} &> /dev/null" EXIT
docker run ——rm —name=${BUILD_TAG} my_image:1.0
do_work.sh
Docker stucks: trap for docker!
Add trap for $DOCKER_TAG
trap "{
docker ps -aq --filter name=$BUILD_TAG |
xargs --no-run-if-empty docker rm -f --volumes ||
true;
} &> /dev/null" EXIT
docker run ——rm —name=${BUILD_TAG} my_image:1.0
do_work.sh
Lightweight docker image?!
docker images have trend to
become bigger and bigger
from 500 MB… up to 3.2 GB
Let’s share common stuff
Base images
• configs
• user
• packages
Let’s share common stuff
FROM base:1.0
RUN apt-get install
gcc-4.9 python
FROM base:1.0
RUN apt-get install
gcc-4.9 nodejs
Base images
Let’s share common stuff
Base images
FROM ubuntu:16.04
RUN apt-get install
gcc-4.9
FROM base:1.0
RUN apt-get install
python
FROM base:1.0
RUN apt-get install
nodejs
Day 2
Chaos
Duplicated code is not worst duplicate problem
Docker image should do one thing only
Need something? Just put to the
basic image and enjoy!
Docker image should do one thing only
Split base image to build and test
images
- base image for building
- base image for testing (no -dev
packages)
- do not mix different tests
Mandatory reviews
Too many images -> too easy to
copy/paste
Mandatory reviews
Restrict permissions to repository
Too many projects
Hard to review:
• Explain same things multiple
times
• Argue
Simplify review process
Static analyzes:
• versions
• number of layers
• hardcoded value
• etc.
Day 3
Still not perfect
But already much better!
Images are still big
Hard to explain best practices
each time:
• no-install-recommends
• rm -rf /var/lib/apt/lists
• apt-get clean
etc/apt/apt.conf.d/docker-no-cache
Dpkg {
# Don't keep copies of packages after
download
 Cache "";
    Cache::archives "";
# Always delete list of packages
    Post-Invoke {"rm -rf /var/lib/apt/lists”;};
}
APT {
    Install-Recommends "false";
}
DSELECT::Clean "always”;
etc/apt/apt.conf.d/docker-no-cache
Dpkg {
# Don't keep copies of packages after
download
 Cache "";
    Cache::archives "";
# Always delete list of packages
    Post-Invoke {"rm -rf /var/lib/apt/lists”;};
}
APT {
    Install-Recommends "false";
}
DSELECT::Clean "always”;
etc/apt/apt.conf.d/docker-no-cache
Dpkg {
# Don't keep copies of packages after
download
 Cache "";
    Cache::archives "";
# Always delete list of packages
    Post-Invoke {"rm -rf /var/lib/apt/lists”;};
}
APT {
    Install-Recommends "false";
}
DSELECT::Clean "always”;
etc/apt/apt.conf.d/docker-no-cache
Dpkg {
# Don't keep copies of packages after
download   
 Cache "";
    Cache::archives "";
# Always delete list of packages
    Post-Invoke {"rm -rf /var/lib/apt/lists”;};
}
APT {
    Install-Recommends "false";
}
DSELECT::Clean "always”;
External dependency
It’s not safe to query Internet in
pre-commit
Still.
Restrict external resources
--net=none
--net=container:$BUILD_TAG
are only allowed in pre-submit tests
And a little bit more in builds
Restrict resources
All tests must be equal
• thread starvation
• oom-killer
• prevent regressions
Restrict external resources
standard profiles and recommend
values:
--cpus
--memory
Docker registry returns 500
Docker registry is down
• everything is blocked
• nothing is really needed from
registry
Docker registry returns 500
Don’t do `docker pull` if it’s not
needed
• check existing images
• exclude “:latest”
• not our registry
Day X
New day - new challenges
Monitoring
We monitor:
- uptime for `docker run`
- parameters
- infra issues
Build Failure Analyzer Plugin
• docker: Error response from daemon: linux runtime spec
devices: .+
• docker: Error response from daemon: rpc error: code =
2 desc = "containerd: container did not start before
the specified timeout”
• docker: Error response from daemon: Cannot start
container [0-9a-f]+: lstat .+
• docker: Error response from daemon: shim error:
context deadline exceeded.+
Groovy Event Listener Plugin
def bfa = run.getAction(FailureCauseBuildAction.class)
def causes = bfa
.getFailureCauseDisplayData()
.getFoundFailureCauses()
if (bfa != null && !causes.isEmpty()) {
for(def cause :causes) {
final Map<String, Object> data = new HashMap<>();
data.put("name", run.getParent().getFullName())
data.put("cause", cause.getName())
data.put("categories", cause.getCategories().join(','))
data.put("timestamp", run.timestamp.timeInMillis)
data.put(“node", run.getExecutor().getOwner().getNode()
.getNodeName())
logger.log("influx.bfa", bfaData)
}
}
Groovy Event Listener Plugin
def bfa = run.getAction(FailureCauseBuildAction.class)
def causes = bfa
.getFailureCauseDisplayData()
.getFoundFailureCauses()
if (bfa != null && !causes.isEmpty()) {
for(def cause :causes) {
final Map<String, Object> data = new HashMap<>();
data.put("name", run.getParent().getFullName())
data.put("cause", cause.getName())
data.put("categories", cause.getCategories().join(','))
data.put("timestamp", run.timestamp.timeInMillis)
data.put(“node", run.getExecutor().getOwner().getNode()
.getNodeName())
logger.log("influx.bfa", bfaData)
}
}
Groovy Event Listener Plugin
def bfa = run.getAction(FailureCauseBuildAction.class)
def causes = bfa
.getFailureCauseDisplayData()
.getFoundFailureCauses()
if (bfa != null && !causes.isEmpty()) {
for(def cause :causes) {
final Map<String, Object> data = new HashMap<>();
data.put("name", run.getParent().getFullName())
data.put("cause", cause.getName())
data.put("categories", cause.getCategories().join(','))
data.put("timestamp", run.timestamp.timeInMillis)
data.put(“node", run.getExecutor().getOwner().getNode()
.getNodeName())
logger.log("influx.bfa", bfaData)
}
}
Groovy Event Listener Plugin
def bfa = run.getAction(FailureCauseBuildAction.class)
def causes = bfa
.getFailureCauseDisplayData()
.getFoundFailureCauses()
if (bfa != null && !causes.isEmpty()) {
for(def cause :causes) {
final Map<String, Object> data = new HashMap<>();
data.put("name", run.getParent().getFullName())
data.put("cause", cause.getName())
data.put("categories", cause.getCategories().join(','))
data.put("timestamp", run.timestamp.timeInMillis)
data.put(“node", run.getExecutor().getOwner().getNode()
.getNodeName())
logger.log("influx.bfa", bfaData)
}
}
Groovy Event Listener Plugin
def bfa = run.getAction(FailureCauseBuildAction.class)
def causes = bfa
.getFailureCauseDisplayData()
.getFoundFailureCauses()
if (bfa != null && !causes.isEmpty()) {
for(def cause :causes) {
final Map<String, Object> data = new HashMap<>();
data.put("name", run.getParent().getFullName())
data.put("cause", cause.getName())
data.put("categories", cause.getCategories().join(','))
data.put("timestamp", run.timestamp.timeInMillis)
data.put(“node", run.getExecutor().getOwner().getNode()
.getNodeName())
logger.log("influx.bfa", bfaData)
}
}
FluentD
<match influx.bfa>
<store>
@type influxdb
host influxdb.internal
port 8086
dbname bfs
tag_keys ["name","node","cause","categories"]
timestamp_tag timestamp
time_precision ms
</store>
</match>
FluentD
<match influx.bfa>
<store>
@type influxdb
host influxdb.internal
port 8086
dbname bfs
tag_keys ["name","node","cause","categories"]
timestamp_tag timestamp
time_precision ms
</store>
</match>
Docker issues per week
Morale
Morale
• There is no silver bullet
• Consider Dockerfile as a source code
• Build monitoring for your CI
• Docker is under development (still)
• Docker really helps to stabilize CI
pipelines
Thank you
Contact
Alexander Akbashev
HERE
Invalidenstraße 116
10115 Berlin
GitHub: Jimilian
alexander.akbashev@here.com

More Related Content

What's hot

Enjoying k8s cluster with Minikube and Helm
Enjoying k8s cluster with Minikube and HelmEnjoying k8s cluster with Minikube and Helm
Enjoying k8s cluster with Minikube and Helmロフト くん
 
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOpsОмские ИТ-субботники
 
Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署Bo-Yi Wu
 
手把手帶你學Docker 03042017
手把手帶你學Docker 03042017手把手帶你學Docker 03042017
手把手帶你學Docker 03042017Paul Chao
 
Developing and Deploying PHP with Docker
Developing and Deploying PHP with DockerDeveloping and Deploying PHP with Docker
Developing and Deploying PHP with DockerPatrick Mizer
 
Docker All The Things - ASP.NET 4.x and Windows Server Containers
Docker All The Things - ASP.NET 4.x and Windows Server ContainersDocker All The Things - ASP.NET 4.x and Windows Server Containers
Docker All The Things - ASP.NET 4.x and Windows Server ContainersAnthony Chu
 
Deploying Symfony2 app with Ansible
Deploying Symfony2 app with AnsibleDeploying Symfony2 app with Ansible
Deploying Symfony2 app with AnsibleRoman Rodomansky
 
Programowanie AWSa z CLI, boto, Ansiblem i libcloudem
Programowanie AWSa z CLI, boto, Ansiblem i libcloudemProgramowanie AWSa z CLI, boto, Ansiblem i libcloudem
Programowanie AWSa z CLI, boto, Ansiblem i libcloudemMaciej Lasyk
 
Docker for Java developers at JavaLand
Docker for Java developers at JavaLandDocker for Java developers at JavaLand
Docker for Java developers at JavaLandJohan Janssen
 
Securing Containers, One Patch at a Time - Michael Crosby, Docker
Securing Containers, One Patch at a Time - Michael Crosby, DockerSecuring Containers, One Patch at a Time - Michael Crosby, Docker
Securing Containers, One Patch at a Time - Michael Crosby, DockerDocker, Inc.
 
Docker 導入:障礙與對策
Docker 導入:障礙與對策Docker 導入:障礙與對策
Docker 導入:障礙與對策William Yeh
 
Python virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutesPython virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutesLarry Cai
 
Continuous Integration: SaaS vs Jenkins in Cloud
Continuous Integration: SaaS vs Jenkins in CloudContinuous Integration: SaaS vs Jenkins in Cloud
Continuous Integration: SaaS vs Jenkins in CloudIdeato
 
Getting Started with Docker
Getting Started with DockerGetting Started with Docker
Getting Started with DockerGeeta Vinnakota
 
Learn docker in 90 minutes
Learn docker in 90 minutesLearn docker in 90 minutes
Learn docker in 90 minutesLarry Cai
 
Cloud Foundry V2 | Intermediate Deep Dive
Cloud Foundry V2 | Intermediate Deep DiveCloud Foundry V2 | Intermediate Deep Dive
Cloud Foundry V2 | Intermediate Deep DiveKazuto Kusama
 
Ansible+docker (highload++2015)
Ansible+docker (highload++2015)Ansible+docker (highload++2015)
Ansible+docker (highload++2015)Pavel Alexeev
 
제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-Ranchers
제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-Ranchers제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-Ranchers
제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-RanchersTommy Lee
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupalAndrii Podanenko
 
Drupal contrib module maintaining
Drupal contrib module maintainingDrupal contrib module maintaining
Drupal contrib module maintainingAndrii Podanenko
 

What's hot (20)

Enjoying k8s cluster with Minikube and Helm
Enjoying k8s cluster with Minikube and HelmEnjoying k8s cluster with Minikube and Helm
Enjoying k8s cluster with Minikube and Helm
 
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
 
Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署
 
手把手帶你學Docker 03042017
手把手帶你學Docker 03042017手把手帶你學Docker 03042017
手把手帶你學Docker 03042017
 
Developing and Deploying PHP with Docker
Developing and Deploying PHP with DockerDeveloping and Deploying PHP with Docker
Developing and Deploying PHP with Docker
 
Docker All The Things - ASP.NET 4.x and Windows Server Containers
Docker All The Things - ASP.NET 4.x and Windows Server ContainersDocker All The Things - ASP.NET 4.x and Windows Server Containers
Docker All The Things - ASP.NET 4.x and Windows Server Containers
 
Deploying Symfony2 app with Ansible
Deploying Symfony2 app with AnsibleDeploying Symfony2 app with Ansible
Deploying Symfony2 app with Ansible
 
Programowanie AWSa z CLI, boto, Ansiblem i libcloudem
Programowanie AWSa z CLI, boto, Ansiblem i libcloudemProgramowanie AWSa z CLI, boto, Ansiblem i libcloudem
Programowanie AWSa z CLI, boto, Ansiblem i libcloudem
 
Docker for Java developers at JavaLand
Docker for Java developers at JavaLandDocker for Java developers at JavaLand
Docker for Java developers at JavaLand
 
Securing Containers, One Patch at a Time - Michael Crosby, Docker
Securing Containers, One Patch at a Time - Michael Crosby, DockerSecuring Containers, One Patch at a Time - Michael Crosby, Docker
Securing Containers, One Patch at a Time - Michael Crosby, Docker
 
Docker 導入:障礙與對策
Docker 導入:障礙與對策Docker 導入:障礙與對策
Docker 導入:障礙與對策
 
Python virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutesPython virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutes
 
Continuous Integration: SaaS vs Jenkins in Cloud
Continuous Integration: SaaS vs Jenkins in CloudContinuous Integration: SaaS vs Jenkins in Cloud
Continuous Integration: SaaS vs Jenkins in Cloud
 
Getting Started with Docker
Getting Started with DockerGetting Started with Docker
Getting Started with Docker
 
Learn docker in 90 minutes
Learn docker in 90 minutesLearn docker in 90 minutes
Learn docker in 90 minutes
 
Cloud Foundry V2 | Intermediate Deep Dive
Cloud Foundry V2 | Intermediate Deep DiveCloud Foundry V2 | Intermediate Deep Dive
Cloud Foundry V2 | Intermediate Deep Dive
 
Ansible+docker (highload++2015)
Ansible+docker (highload++2015)Ansible+docker (highload++2015)
Ansible+docker (highload++2015)
 
제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-Ranchers
제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-Ranchers제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-Ranchers
제4회 한국IBM과 함께하는 난공불락 오픈소스 인프라 세미나-Ranchers
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupal
 
Drupal contrib module maintaining
Drupal contrib module maintainingDrupal contrib module maintaining
Drupal contrib module maintaining
 

Similar to Использование Docker в CI / Александр Акбашев (HERE Technologies)

Docker in Continuous Integration
Docker in Continuous IntegrationDocker in Continuous Integration
Docker in Continuous IntegrationAlexander Akbashev
 
Streamline your development environment with docker
Streamline your development environment with dockerStreamline your development environment with docker
Streamline your development environment with dockerGiacomo Bagnoli
 
Dockerize everything TopConf Tallinn
Dockerize everything TopConf TallinnDockerize everything TopConf Tallinn
Dockerize everything TopConf TallinnThomas Einwaller
 
Hands-On Session Docker
Hands-On Session DockerHands-On Session Docker
Hands-On Session DockerLinetsChile
 
Docker Demo @ IuK Seminar
Docker Demo @ IuK SeminarDocker Demo @ IuK Seminar
Docker Demo @ IuK SeminarMartin Scharm
 
From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...
From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...
From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...Docker, Inc.
 
A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...
A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...
A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...Christy Norman
 
PDXPortland - Dockerize Django
PDXPortland - Dockerize DjangoPDXPortland - Dockerize Django
PDXPortland - Dockerize DjangoHannes Hapke
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014biicode
 
DeveloperWeek 2015: A Practical Introduction to Docker
DeveloperWeek 2015: A Practical Introduction to DockerDeveloperWeek 2015: A Practical Introduction to Docker
DeveloperWeek 2015: A Practical Introduction to DockerSteve Smith
 
Be a better developer with Docker (revision 3)
Be a better developer with Docker (revision 3)Be a better developer with Docker (revision 3)
Be a better developer with Docker (revision 3)Nicola Paolucci
 
Preparation study of_docker - (MOSG)
Preparation study of_docker  - (MOSG)Preparation study of_docker  - (MOSG)
Preparation study of_docker - (MOSG)Soshi Nemoto
 
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...Eric Smalling
 
Docker command
Docker commandDocker command
Docker commandEric Ahn
 
Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...
Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...
Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...NLJUG
 

Similar to Использование Docker в CI / Александр Акбашев (HERE Technologies) (20)

Docker in Continuous Integration
Docker in Continuous IntegrationDocker in Continuous Integration
Docker in Continuous Integration
 
Docker: ao vivo e a cores
Docker: ao vivo e a coresDocker: ao vivo e a cores
Docker: ao vivo e a cores
 
Streamline your development environment with docker
Streamline your development environment with dockerStreamline your development environment with docker
Streamline your development environment with docker
 
Docker perl build
Docker perl buildDocker perl build
Docker perl build
 
Dockerize everything TopConf Tallinn
Dockerize everything TopConf TallinnDockerize everything TopConf Tallinn
Dockerize everything TopConf Tallinn
 
Hands-On Session Docker
Hands-On Session DockerHands-On Session Docker
Hands-On Session Docker
 
Docker Demo @ IuK Seminar
Docker Demo @ IuK SeminarDocker Demo @ IuK Seminar
Docker Demo @ IuK Seminar
 
From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...
From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...
From Arm to Z: Building, Shipping, and Running a Multi-platform Docker Swarm ...
 
A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...
A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...
A to Z of a Multi-platform Docker Swarm: Building, Shipping, and Running Mult...
 
PDXPortland - Dockerize Django
PDXPortland - Dockerize DjangoPDXPortland - Dockerize Django
PDXPortland - Dockerize Django
 
Docker as an every day work tool
Docker as an every day work toolDocker as an every day work tool
Docker as an every day work tool
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
DeveloperWeek 2015: A Practical Introduction to Docker
DeveloperWeek 2015: A Practical Introduction to DockerDeveloperWeek 2015: A Practical Introduction to Docker
DeveloperWeek 2015: A Practical Introduction to Docker
 
ABCs of docker
ABCs of dockerABCs of docker
ABCs of docker
 
Be a better developer with Docker (revision 3)
Be a better developer with Docker (revision 3)Be a better developer with Docker (revision 3)
Be a better developer with Docker (revision 3)
 
Docker by Example - Basics
Docker by Example - Basics Docker by Example - Basics
Docker by Example - Basics
 
Preparation study of_docker - (MOSG)
Preparation study of_docker  - (MOSG)Preparation study of_docker  - (MOSG)
Preparation study of_docker - (MOSG)
 
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
 
Docker command
Docker commandDocker command
Docker command
 
Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...
Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...
Gebruik dezelfde Docker container voor Java applicaties tijdens ontwikkelen e...
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Recently uploaded

Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxKartikeyaDwivedi3
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )Tsuyoshi Horigome
 
IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024Mark Billinghurst
 
Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.eptoze12
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...srsj9000
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort servicejennyeacort
 
Introduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxIntroduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxk795866
 
Application of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptxApplication of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptx959SahilShah
 
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...Soham Mondal
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSCAESB
 
What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxwendy cai
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVRajaP95
 
Churning of Butter, Factors affecting .
Churning of Butter, Factors affecting  .Churning of Butter, Factors affecting  .
Churning of Butter, Factors affecting .Satyam Kumar
 
Electronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdfElectronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdfme23b1001
 

Recently uploaded (20)

Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptx
 
POWER SYSTEMS-1 Complete notes examples
POWER SYSTEMS-1 Complete notes  examplesPOWER SYSTEMS-1 Complete notes  examples
POWER SYSTEMS-1 Complete notes examples
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )
 
IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024
 
Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.
 
young call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Serviceyoung call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Service
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
 
Introduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxIntroduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptx
 
Application of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptxApplication of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptx
 
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
 
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
 
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCRCall Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentation
 
What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptx
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
 
Churning of Butter, Factors affecting .
Churning of Butter, Factors affecting  .Churning of Butter, Factors affecting  .
Churning of Butter, Factors affecting .
 
Electronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdfElectronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdf
 
Design and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdfDesign and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdf
 

Использование Docker в CI / Александр Акбашев (HERE Technologies)

  • 1. Alexander Akbashev RootConf | June 06, 2017 Docker in Continuous Integration
  • 2.
  • 3. Agenda • Context • Very naive time • Start Project Docker • Something went wrong • Chaos • Still not perfect • New day - new challenges • Monitoring • Morale
  • 4. Context What does CI System mean for us
  • 5. Context • Self-hosted Jenkins • Cloud based + target hardware in the labs • Tons of configured project • All changes are going through pre-commit validation pipelines • Different platform and different products • Our users are our colleagues
  • 6. Day 0 Very naive time Everything was so simple… to break
  • 7. Mutable host - Yes, I really want to change /etc/ hosts for my integration test - …
  • 8. One agent - one package You don’t want to mix some stuff on one host • one version of python • one version of system library • one version of everything
  • 9. New package - new pain - Oops, I didn’t know that libXYZ-1.2 comes with new API compare to libXYZ-1.1
  • 10. Painful verification process To test new package you need: • new node • new label • cloned job (multiple jobs?) • … but it’s used in 100+ projects…
  • 11. Bad utilization Some nodes are needed only in rare cases I want to test only on CentOS 5! It’s my favourite production OS!
  • 12. Download to build Java, Python, Ruby, nodeJs tends to download staff on-the-fly
  • 13. External dependency It’s not safe to query Internet in pre-commit > Could not resolve commons-io:commons-io:2.4. > Could not get resource https://jcenter.bintray.com/commons- io/commons-io/2.4/commons-io-2.4.pom > Received status code 500 from server: Internal Server Error
  • 15. Docker is so awesome! • We can control docker content • CI builds are reproducible locally • Tests do not affect each other • We can cache stuff in docker
  • 18. Dockerfile FROM ubuntu:16.04 RUN apt-get update RUN apt-get -y install gcc ccache cppcheck
  • 19. docker build Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:16.04 ---> f49eec89601e Step 2/3 : RUN apt-get update ---> Running in c469408dd82f ---> 3964096123fa Removing intermediate container c469408dd82f Step 3/3 : RUN apt-get -y install g++ ccache cppcheck ---> Running in dc0e107be645 Removing intermediate container dc0e107be645 Successfully built 06f880788e38
  • 20. docker build Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:16.04 ---> f49eec89601e Step 2/3 : RUN apt-get update ---> Running in c469408dd82f ---> 3964096123fa Removing intermediate container c469408dd82f Step 3/3 : RUN apt-get -y install g++ ccache cppcheck ---> Running in dc0e107be645 Removing intermediate container dc0e107be645 Successfully built 06f880788e38
  • 21. docker image history IMAGE CREATED (ago) CREATED BY SIZE 06f880788e38 6 minutes apt-get -y install gcc… 153MB 3964096123fa 7 minutes apt-get update 40MB <missing> 4 months mkdir -p /run/... 7B <missing> 4 months sed -i ’s/^... 1.9kB <missing> 4 months set -xe &... 745B <missing> 4 months (nop) ADD file 68f83d96c… 129MB
  • 22. docker image history IMAGE CREATED (ago) CREATED BY SIZE 06f880788e38 6 minutes apt-get -y install gcc… 153MB 3964096123fa 7 minutes apt-get update 40MB <missing> 4 months mkdir -p /run/... 7B <missing> 4 months sed -i ’s/^... 1.9kB <missing> 4 months set -xe &... 745B <missing> 4 months (nop) ADD file 68f83d96c… 129MB
  • 23. docker image history IMAGE CREATED (ago) CREATED BY SIZE 06f880788e38 6 minutes apt-get -y install gcc… 153MB 3964096123fa 7 minutes apt-get update 40MB <missing> 4 months mkdir -p /run/... 7B <missing> 4 months sed -i ’s/^... 1.9kB <missing> 4 months set -xe &... 745B <missing> 4 months (nop) ADD file 68f83d96c… 129MB
  • 24. docker image history IMAGE CREATED (ago) CREATED BY SIZE 06f880788e38 6 minutes apt-get -y install gcc… 153MB 3964096123fa 7 minutes apt-get update 40MB <missing> 4 months mkdir -p /run/... 7B <missing> 4 months sed -i ’s/^... 1.9kB <missing> 4 months set -xe &... 745B <missing> 4 months (nop) ADD file 68f83d96c… 129MB
  • 25. docker image history IMAGE CREATED (ago) CREATED BY SIZE 17534b008d4e 10 seconds apt-get update && apt-ge… 153MB <missing> 4 months mkdir -p /run/... 7B <missing> 4 months sed -i ’s/^... 1.9kB <missing> 4 months set -xe &... 745B <missing> 4 months (nop) ADD file 68f83d96c… 129MB
  • 26. docker push uploads image to central storage: • DockerHub • Artifactory • AWS ECR • default
  • 27. docker pull verifies that image is up-to-date download layers extract layers
  • 28. docker run pulls if image doesn’t exist executes command in container
  • 29. Day 1 Something went wrong Our expectations didn’t meet reality
  • 30. New image - new pain docker pull my_product:latest docker pull test:latest sha256:12d30ce421ad530494d588f87b2328ddc3ca Status: Downloaded newer image for test:latest
  • 31. New image - new pain docker pull my_product:latest docker pull test:latest sha256:12d30ce421ad530494d588f87b2328ddc3ca Status: Downloaded newer image for test:latest docker pull test:latest sha256:01a21daf124543213d1a0514523612345198 Status: Downloaded newer image for test:latest
  • 32. New image - new pain docker pull my_product:latest docker pull test:latest sha256:12d30ce421ad530494d588f87b2328ddc3ca Status: Downloaded newer image for test:latest docker pull test:latest sha256:01a21daf124543213d1a0514523612345198 Status: Downloaded newer image for test:latest
  • 33. Testing new images in pre-commit • tag as a version number • versioning is mandatory (no “latest” anymore!) • overrides are not allowed • actual version is defined in config file (pre-submit testable now)
  • 34. Timeouts “docker pull” times out docker pull my_image:1.0 b6f892: Downloading [===========> ] XX MB/YY MB 55010f: Downloading [============> ] XX MB/YY MB 2955fb: Downloading [=============> ] XX MB/YY MB
  • 35. Timeouts New feature in Timeout Plugin -> Step with timeout All images are backed in AMI itself
  • 36. Docker stucks --rm doesn’t guarantee much docker run ——rm my_image:1.0 do_work.sh
  • 37. Docker stucks: trap for docker! Add trap for $DOCKER_TAG trap "{ docker ps -aq --filter name=$BUILD_TAG | xargs --no-run-if-empty docker rm -f --volumes || true; } &> /dev/null" EXIT docker run ——rm —name=${BUILD_TAG} my_image:1.0 do_work.sh
  • 38. Docker stucks: trap for docker! Add trap for $DOCKER_TAG trap "{ docker ps -aq --filter name=$BUILD_TAG | xargs --no-run-if-empty docker rm -f --volumes || true; } &> /dev/null" EXIT docker run ——rm —name=${BUILD_TAG} my_image:1.0 do_work.sh
  • 39. Lightweight docker image?! docker images have trend to become bigger and bigger from 500 MB… up to 3.2 GB
  • 40. Let’s share common stuff Base images • configs • user • packages
  • 41. Let’s share common stuff FROM base:1.0 RUN apt-get install gcc-4.9 python FROM base:1.0 RUN apt-get install gcc-4.9 nodejs Base images
  • 42. Let’s share common stuff Base images FROM ubuntu:16.04 RUN apt-get install gcc-4.9 FROM base:1.0 RUN apt-get install python FROM base:1.0 RUN apt-get install nodejs
  • 43. Day 2 Chaos Duplicated code is not worst duplicate problem
  • 44. Docker image should do one thing only Need something? Just put to the basic image and enjoy!
  • 45. Docker image should do one thing only Split base image to build and test images - base image for building - base image for testing (no -dev packages) - do not mix different tests
  • 46. Mandatory reviews Too many images -> too easy to copy/paste
  • 48. Too many projects Hard to review: • Explain same things multiple times • Argue
  • 49. Simplify review process Static analyzes: • versions • number of layers • hardcoded value • etc.
  • 50. Day 3 Still not perfect But already much better!
  • 51. Images are still big Hard to explain best practices each time: • no-install-recommends • rm -rf /var/lib/apt/lists • apt-get clean
  • 52. etc/apt/apt.conf.d/docker-no-cache Dpkg { # Don't keep copies of packages after download  Cache "";     Cache::archives ""; # Always delete list of packages     Post-Invoke {"rm -rf /var/lib/apt/lists”;}; } APT {     Install-Recommends "false"; } DSELECT::Clean "always”;
  • 53. etc/apt/apt.conf.d/docker-no-cache Dpkg { # Don't keep copies of packages after download  Cache "";     Cache::archives ""; # Always delete list of packages     Post-Invoke {"rm -rf /var/lib/apt/lists”;}; } APT {     Install-Recommends "false"; } DSELECT::Clean "always”;
  • 54. etc/apt/apt.conf.d/docker-no-cache Dpkg { # Don't keep copies of packages after download  Cache "";     Cache::archives ""; # Always delete list of packages     Post-Invoke {"rm -rf /var/lib/apt/lists”;}; } APT {     Install-Recommends "false"; } DSELECT::Clean "always”;
  • 55. etc/apt/apt.conf.d/docker-no-cache Dpkg { # Don't keep copies of packages after download     Cache "";     Cache::archives ""; # Always delete list of packages     Post-Invoke {"rm -rf /var/lib/apt/lists”;}; } APT {     Install-Recommends "false"; } DSELECT::Clean "always”;
  • 56. External dependency It’s not safe to query Internet in pre-commit Still.
  • 57. Restrict external resources --net=none --net=container:$BUILD_TAG are only allowed in pre-submit tests And a little bit more in builds
  • 58. Restrict resources All tests must be equal • thread starvation • oom-killer • prevent regressions
  • 59. Restrict external resources standard profiles and recommend values: --cpus --memory
  • 60. Docker registry returns 500 Docker registry is down • everything is blocked • nothing is really needed from registry
  • 61. Docker registry returns 500 Don’t do `docker pull` if it’s not needed • check existing images • exclude “:latest” • not our registry
  • 62. Day X New day - new challenges
  • 63. Monitoring We monitor: - uptime for `docker run` - parameters - infra issues
  • 64. Build Failure Analyzer Plugin • docker: Error response from daemon: linux runtime spec devices: .+ • docker: Error response from daemon: rpc error: code = 2 desc = "containerd: container did not start before the specified timeout” • docker: Error response from daemon: Cannot start container [0-9a-f]+: lstat .+ • docker: Error response from daemon: shim error: context deadline exceeded.+
  • 65. Groovy Event Listener Plugin def bfa = run.getAction(FailureCauseBuildAction.class) def causes = bfa .getFailureCauseDisplayData() .getFoundFailureCauses() if (bfa != null && !causes.isEmpty()) { for(def cause :causes) { final Map<String, Object> data = new HashMap<>(); data.put("name", run.getParent().getFullName()) data.put("cause", cause.getName()) data.put("categories", cause.getCategories().join(',')) data.put("timestamp", run.timestamp.timeInMillis) data.put(“node", run.getExecutor().getOwner().getNode() .getNodeName()) logger.log("influx.bfa", bfaData) } }
  • 66. Groovy Event Listener Plugin def bfa = run.getAction(FailureCauseBuildAction.class) def causes = bfa .getFailureCauseDisplayData() .getFoundFailureCauses() if (bfa != null && !causes.isEmpty()) { for(def cause :causes) { final Map<String, Object> data = new HashMap<>(); data.put("name", run.getParent().getFullName()) data.put("cause", cause.getName()) data.put("categories", cause.getCategories().join(',')) data.put("timestamp", run.timestamp.timeInMillis) data.put(“node", run.getExecutor().getOwner().getNode() .getNodeName()) logger.log("influx.bfa", bfaData) } }
  • 67. Groovy Event Listener Plugin def bfa = run.getAction(FailureCauseBuildAction.class) def causes = bfa .getFailureCauseDisplayData() .getFoundFailureCauses() if (bfa != null && !causes.isEmpty()) { for(def cause :causes) { final Map<String, Object> data = new HashMap<>(); data.put("name", run.getParent().getFullName()) data.put("cause", cause.getName()) data.put("categories", cause.getCategories().join(',')) data.put("timestamp", run.timestamp.timeInMillis) data.put(“node", run.getExecutor().getOwner().getNode() .getNodeName()) logger.log("influx.bfa", bfaData) } }
  • 68. Groovy Event Listener Plugin def bfa = run.getAction(FailureCauseBuildAction.class) def causes = bfa .getFailureCauseDisplayData() .getFoundFailureCauses() if (bfa != null && !causes.isEmpty()) { for(def cause :causes) { final Map<String, Object> data = new HashMap<>(); data.put("name", run.getParent().getFullName()) data.put("cause", cause.getName()) data.put("categories", cause.getCategories().join(',')) data.put("timestamp", run.timestamp.timeInMillis) data.put(“node", run.getExecutor().getOwner().getNode() .getNodeName()) logger.log("influx.bfa", bfaData) } }
  • 69. Groovy Event Listener Plugin def bfa = run.getAction(FailureCauseBuildAction.class) def causes = bfa .getFailureCauseDisplayData() .getFoundFailureCauses() if (bfa != null && !causes.isEmpty()) { for(def cause :causes) { final Map<String, Object> data = new HashMap<>(); data.put("name", run.getParent().getFullName()) data.put("cause", cause.getName()) data.put("categories", cause.getCategories().join(',')) data.put("timestamp", run.timestamp.timeInMillis) data.put(“node", run.getExecutor().getOwner().getNode() .getNodeName()) logger.log("influx.bfa", bfaData) } }
  • 70. FluentD <match influx.bfa> <store> @type influxdb host influxdb.internal port 8086 dbname bfs tag_keys ["name","node","cause","categories"] timestamp_tag timestamp time_precision ms </store> </match>
  • 71. FluentD <match influx.bfa> <store> @type influxdb host influxdb.internal port 8086 dbname bfs tag_keys ["name","node","cause","categories"] timestamp_tag timestamp time_precision ms </store> </match>
  • 74. Morale • There is no silver bullet • Consider Dockerfile as a source code • Build monitoring for your CI • Docker is under development (still) • Docker really helps to stabilize CI pipelines
  • 75. Thank you Contact Alexander Akbashev HERE Invalidenstraße 116 10115 Berlin GitHub: Jimilian alexander.akbashev@here.com