#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
author: Ewen Wang
email: wolfgangwong2012@gmail.com
license: Apache License 2.0
"""
[docs]
def template_docker(project='[project]',
uri_suffix='amazonaws.com.cn',
pip_image=True,
python_version='3.7-slim-buster'):
"""Build a docker image to AWS ECR for a machine learning project.
Args:
project (str): Used as a name of an AWS ECR repository to be setup
uri_suffix (str): Suffix of URL, default 'amazonaws.com.cn'
pip_image (bool): Whether a pip image is needed, default True and use douban image
python_version (str): Python version, default '3.7-slim-buster'
Yields:
A template Docker setup Bash file and a template requirements file to the current directory.
"""
ecr_repository = project
if pip_image:
pip_image = "-i https://pypi.douban.com/simple/"
template_docker=\
"""#!/bin/bash
account_id=$(aws sts get-caller-identity --query Account --output text)
region=$(aws configure get region)
uri_suffix="{}"
# DOCKER
# ========================================================================================================
# WRITE DOCKER FILE
mkdir -p docker
cp requirements.txt docker/requirements.txt
cd docker
rm Dockerfile
cat <<EOF>> Dockerfile
FROM python:{}
RUN apt update -y && \
apt install -y --no-install-recommends libgomp1 build-essential && \
apt clean
COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN /usr/local/bin/python -m pip install --upgrade pip {}
RUN pip3 install -r requirements.txt {}
COPY . /opt/app
ENV PYTHONUNBUFFERED=TRUE
RUN export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
EOF
cd ..
# CREATE ECR REPOSITORY AND PUSH DOCKER IMAGE
# ========================================================================================================
ecr_repository="{}"
tag=":latest"
repository_uri="$account_id.dkr.ecr.$region.$uri_suffix/$ecr_repository$tag"
docker build -t $ecr_repository docker
$(aws ecr get-login --region $region --registry-ids $account_id --no-include-email)
aws ecr create-repository --repository-name $ecr_repository
docker tag $ecr_repository$tag $repository_uri
docker push $repository_uri
""".format(uri_suffix, python_version, pip_image, pip_image, ecr_repository)
with open('setup_docker.sh', 'w') as writer:
writer.write(template_docker)
template_req_docker=\
"""numpy==1.21.1
pandas==1.3.4
matplotlib==3.3.2
scikit-learn==0.24.2
traitlets==5.0.5
numba==0.52.0
boto3==1.18.57
botocore==1.21.57
pyathena==2.3.0
stepfunctions==2.2.0
sagemaker==2.59.8
sagemaker_experiments==0.1.35
sagemaker-training==3.9.2
protobuf==3.19.4
redshift_connector==2.0.888
sqlalchemy==1.3.23
psycopg2==2.7.7
psycopg2-binary==2.9.1
mlxtend==0.19.0
gossipcat
batcat
"""
with open('requirements.txt', 'w') as writer:
writer.write(template_req_docker)
return None
def main():
template_docker()
if __name__ == '__main__':
main()