Skip to content

Commit 7da1e73

Browse files
DEVOPS-61 scan dockerofkrishnadhas docker images with trivy
1 parent 9a1f1d7 commit 7da1e73

File tree

7 files changed

+395
-1
lines changed

7 files changed

+395
-1
lines changed

.github/dependabot.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "pip"
4+
directory: /
5+
schedule:
6+
interval: "weekly"
7+
day: saturday
8+
time: "09:00"
9+
timezone: Asia/Kolkata
10+
# Assignees to set on pull requests
11+
assignees:
12+
- "githubofkrishnadhas"
13+
# prefix specifies a prefix for all commit messages. When you specify a prefix for commit messages,
14+
# GitHub will automatically add a colon between the defined prefix and the commit message provided the
15+
# defined prefix ends with a letter, number, closing parenthesis, or closing bracket.
16+
commit-message:
17+
prefix: "dependabot python package"
18+
# Use reviewers to specify individual reviewers or teams of reviewers for all pull requests raised for a package manager.
19+
reviewers:
20+
- "devwithkrishna/admin"
21+
# Raise pull requests for version updates to pip against the `main` branch
22+
target-branch: "main"
23+
# Labels on pull requests for version updates only
24+
labels:
25+
- "pip dependencies"
26+
# Increase the version requirements for Composer only when required
27+
versioning-strategy: increase-if-necessary
28+
# Dependabot opens a maximum of five pull requests for version updates. Once there are five open pull requests from Dependabot,
29+
# Dependabot will not open any new requests until some of those open requests are merged or closed.
30+
# Use open-pull-requests-limit to change this limit.
31+
open-pull-requests-limit: 10
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: scan-docker-images-using-trivy
2+
on:
3+
schedule:
4+
- cron: '0 0 * * 0' # weekly once
5+
workflow_dispatch:
6+
inputs:
7+
dockerhub_username:
8+
description: 'Dockerhub username'
9+
required: true
10+
type: string
11+
default: 'dockerofkrishnadhas'
12+
13+
run-name: scan-docker-images-using-trivy-from-dockerofkrishnadhas-dockerhub
14+
jobs:
15+
scan-docker-images-using-trivy-from-dockerofkrishnadhas-dockerhub:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- name: Check out the repo
19+
uses: actions/checkout@v4
20+
- name: set up python 3.11
21+
uses: actions/setup-python@v4
22+
with:
23+
python-version: '3.11'
24+
- name: package installations
25+
run: |
26+
pip install pipenv
27+
pipenv install
28+
- name: execute python program
29+
run: |
30+
pipenv run python3 get_all_docker_image_tags.py --account_name ${{ inputs.dockerhub_username }}
31+
- name: check files
32+
run: |
33+
ls -la
34+
- name: set up docker and scan docker image for vulnerabilities
35+
uses: docker-practice/actions-setup-docker@master
36+
- run: |
37+
set -x
38+
docker version
39+
images=$(cat docker_images_details_dockerofkrishnadhas.json | jq -r '.[]')
40+
for image in $images
41+
do
42+
docker pull $image
43+
start_time=$(date +%s)
44+
echo "Scanning started for image: $image at $(date)"
45+
docker run -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image $image
46+
end_time=$(date +%s)
47+
duration=$((end_time - start_time))
48+
echo "Scanning ended for image: $image at $(date)"
49+
echo "Duration for image $image: $duration seconds"
50+
done
51+
- name: Completed
52+
run: |
53+
echo "program completed successfully"

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,5 @@ cython_debug/
157157
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158158
# and can be added to the global gitignore or merged into this file. For a more nuclear
159159
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
160-
#.idea/
160+
.idea/
161+
*.json

Pipfile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[[source]]
2+
url = "https://pypi.org/simple"
3+
verify_ssl = true
4+
name = "pypi"
5+
6+
[packages]
7+
requests = "=2.31.0"
8+
argparse = "=1.4.0"
9+
python-dotenv = "=1.0.1"
10+
11+
12+
[requires]
13+
python_version = "3"

Pipfile.lock

Lines changed: 167 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

get_all_docker_image_tags.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import requests
2+
import argparse
3+
import json
4+
from datetime import datetime
5+
6+
7+
def get_all_images_from_dockerhub(account_name:str):
8+
"""
9+
function to retrieve docker images list
10+
:param account_name: docker hub acccount name. default dockerofkrishnadhas
11+
:return:
12+
"""
13+
api_endpoint = f'https://hub.docker.com/v2/repositories/{account_name}/'
14+
# print(api_endpoint)
15+
# Define pagination parameters
16+
per_page = 50 # Number of records per page
17+
page = 1 # Initial page number
18+
docker_image_names_list = []
19+
while True:
20+
params = {
21+
'per_page': per_page, # Number of results per page
22+
'page': page # Page number
23+
}
24+
# API call
25+
response = requests.get(url=api_endpoint, params=params)
26+
response_json = response.json() ## Github repo details
27+
28+
# Checking the API status code
29+
if response.status_code == 200:
30+
print(f"API request successful on {api_endpoint}")
31+
# print(response_json)
32+
else:
33+
print(f"API request failed with status code {response.status_code}:")
34+
# print(response_json)
35+
break
36+
37+
for images in response_json['results']:
38+
docker_image_names_list.append(images['name'])
39+
40+
page += 1 # Move to the next page
41+
file_name = f'docker_images_tags_{account_name}_results.json'
42+
with open(file_name, 'w') as json_file:
43+
json.dump(response_json['results'], json_file, indent=4)
44+
# Break the loop if no more pages
45+
if len(response_json['results']) < per_page:
46+
break
47+
print(f'Total number of images under {account_name} is : {len(docker_image_names_list)}')
48+
49+
return docker_image_names_list
50+
51+
def get_image_tags_from_repository(account_name: str):
52+
"""
53+
get the tags from a docker image
54+
:param account_name:
55+
:return:
56+
"""
57+
docker_image_names_list = get_all_images_from_dockerhub(account_name=account_name)
58+
docker_image_tag_list = []
59+
for image in docker_image_names_list:
60+
tag_endpoint = f'https://hub.docker.com/v2/namespaces/{account_name}/repositories/{image}/tags'
61+
# print(tag_endpoint)
62+
response = requests.get(tag_endpoint)
63+
# Checking the API status code
64+
if response.status_code == 200:
65+
print(f"API request successful on {tag_endpoint}")
66+
# print(response_json)
67+
else:
68+
print(f"API request failed with status code {response.status_code}:")
69+
# print(response_json)
70+
break
71+
response_json = response.json()
72+
response_json_results = response_json['results']
73+
tag_count = response_json['count']
74+
print(f'Number of tags of {account_name}/{image} is : {tag_count}')
75+
for item in response_json_results:
76+
tag = item['name']
77+
docker_image_tag_list.append(f'{account_name}/{image}:{tag}')
78+
file_name = f'docker_images_details_{account_name}.json'
79+
with open(file_name, 'w') as json_file:
80+
json.dump(docker_image_tag_list, json_file, indent=4)
81+
return docker_image_tag_list
82+
83+
def date_time():
84+
""" Simple function to print time """
85+
now = datetime.now()
86+
current_time = now.strftime("%B %d %Y - %H:%M:%S")
87+
return current_time
88+
89+
90+
def main():
91+
""" To test the code"""
92+
parser = argparse.ArgumentParser("Retrieve Docker images and tags from dockerhub registry using python")
93+
parser.add_argument("--account_name", help="dockerhub user name", required=True, type=str)
94+
95+
args = parser.parse_args()
96+
account_name = args.account_name
97+
starting_time = date_time()
98+
print(f"Proccess to retrieve Docker images and tags from dockerhub registry started at {starting_time} IST......")
99+
docker_image_tag_list = get_image_tags_from_repository(account_name)
100+
print(docker_image_tag_list)
101+
ending_time = date_time()
102+
print(f"Proccess to retrieve Docker images and tags from dockerhub registry completed at {ending_time} IST......")
103+
104+
if __name__ == "__main__":
105+
main()

0 commit comments

Comments
 (0)