# Docker-Shortcuts

Skip the fairy-tale, just give me the code already --> [Click Here](https://teb.codes/2-Code/Docker/Docker-Shortcuts#downloading-the-script)

# Mandatory warning
Rule #1 of Coding Club: NEVER run code you don't understand.

Rule #2 of Coding Club: SERIOUSLY, go back and read Rule #1.

```python
def trust_random_code_from_the_internet():
    print("✨ Found a magic snippet online that promises to solve all your problems!")
    print("Step 1: Copy it.")
    print("Step 2: Paste it.")
    print("Step 3: Watch as your toaster mines Bitcoin and emails your secrets to '[email protected]' 😱")

    print("\nLet's not do that. 💡")
    print("Instead, read the code. Understand it. Test it in a safe environment.")
    print("Trust, but verify. Or even better — distrust by default!")

trust_random_code_from_the_internet()
```

# Description

This script automates the process of building and pushing a Docker image to DockerHub, while incrementally tracking the version number. It uses the directory name as the default local image name, but allows for customization through command-line arguments.

The script builds the Docker image with a version tag in the format `MM.DD.YY.<counter>`, where `<counter>` is an incremental value stored in a file. The image is then tagged with additional tags on DockerHub (`latest` and `<dockerhub_repo>/<image_name>:<date>.<counter>`).

# Usage

To use this script, save it to a file (e.g., `build_and_push_docker_image.sh`) and make it executable by running `chmod +x build_and_push_docker_image.sh`.

You can run the script in three different modes:

1. **No arguments**: The script will use the directory name as both the local image name and Docker image name.
```bash
dcp
```
2. **One argument**: The script will use the parent directory name for the local image name, but allow you to specify a custom Docker image name using the first command-line argument.
```bash
dcp <DOCKER_IMAGE_NAME>
```
3. **Two arguments**: You can specify both the local image name and the Docker image name as separate command-line arguments.
```bash
dcp <LOCAL_IMAGE_NAME> <DOCKER_IMAGE_NAME>
```

# Example Output

When you run the script, it will output something like this:
```
Docker image built with tag: myimage:02.14.21.1
Docker image tagged: <dockerhub_repo>/myimage:02.14.21.1
Docker image tagged: <dockerhub_repo>/myimage:latest
Docker image pushed: <dockerhub_repo>/myimage:02.14.21.1
Docker image pushed: <dockerhub_repo>/myimage:latest

Local Image Name: myimage
Docker Image Name: myimage
```
Note that the exact output may vary depending on your directory name and DockerHub credentials.

# Assumptions

This script assumes you have Docker installed on your system, as well as the `docker` command in your PATH. Additionally, it requires a valid DockerHub account with access to the repository where you want to push your image.

# Downloading the Script

Create folders

```bash
mkdir /opt/dcp
mkdir /opt/dcp/counters
```

You can download this script by running:
```bash
curl -sSO https://github.com/tebwritescode/dcp/blob/14d5d8d8126f94e9867152339f1ee644ee9e1c1e/dcp.sh > /opt/dcp/dcp.sh && chmod +x /opt/dcp/dcp.sh
```

Or copy-pasta, make sure to replace the <dockerhub_repo> instances with your own fuckin' repo

```bash
#!/bin/bash

# Check how many arguments were passed
if [ $# -eq 0 ]; then
    # No arguments passed
    IMAGE_NAME=$(basename "$PWD")
    DOCKER_IMAGE_NAME=$(basename "$PWD")
elif [ $# -eq 1 ]; then
    # One argument passed
    IMAGE_NAME=$(basename "$PWD")
    DOCKER_IMAGE_NAME=$1
elif [ $# -eq 2 ]; then
    # Two arguments passed
    IMAGE_NAME=$1
    DOCKER_IMAGE_NAME=$2
else
    echo "Error: Too many arguments passed."
    echo "Usage: $0 - Use parent directory name for both local and docker image name."
    echo "$0 <DOCKER_IMAGE_NAME> - Use parent directory name for local image name and use <DOCKER_IMAGE_NAME> as docker image name/"
    echo "$0 <IMAGE_NAME> <DOCKER_IMAGE_NAME> - Use <IMAGE_NAME> for local image name and use <DOCKER_IMAGE_NAME> as docker image name/"
    exit 1
fi

# Get today's date in the format MM.DD.YY
DATE=$(date +"%m.%d.%y")

# Define the file where the counter will be stored
COUNTER_FILE="/opt/dcp/counters/build_counter_${DOCKER_IMAGE_NAME}_${DATE}.txt"

# Check if the counter file exists, if not, create it and set the counter to 0
if [ ! -f "$COUNTER_FILE" ]; then
    rm -fv build_counter_${DOCKER_IMAGE_NAME}_*.txt
    echo "0" > "$COUNTER_FILE"
fi

# Read the current counter value
COUNTER=$(cat "$COUNTER_FILE")

# Increment the counter by 1
NEW_COUNTER=$((COUNTER + 1))

# Update the counter in the file
echo "$NEW_COUNTER" > "$COUNTER_FILE"

# Build the Docker image with the version tag in the format MM.DD.YY.<counter>
if ! /usr/bin/docker build -t "$IMAGE_NAME":"$DATE"."$NEW_COUNTER" .; then
    echo "Docker build failed."
    exit 1
fi

# Print the image tag for reference
echo "Docker image built with tag: $IMAGE_NAME:$DATE.$NEW_COUNTER"

# Tag the image for DockerHub
/usr/bin/docker tag "$IMAGE_NAME:$DATE.$NEW_COUNTER" <dockerhub_repo>/"$DOCKER_IMAGE_NAME:$DATE.$NEW_COUNTER"
/usr/bin/docker tag "$IMAGE_NAME:$DATE.$NEW_COUNTER" <dockerhub_repo>/"$DOCKER_IMAGE_NAME:latest"

# Print the image tag for reference
echo "Docker image tagged: <dockerhub_repo>/$DOCKER_IMAGE_NAME:$DATE.$NEW_COUNTER"
echo "Docker image tagged: <dockerhub_repo>/$DOCKER_IMAGE_NAME:latest"

# Push the Docker image to DockerHub
if ! /usr/bin/docker push <dockerhub_repo>/"$DOCKER_IMAGE_NAME:$DATE.$NEW_COUNTER"; then
    echo "Docker push failed for $NEW_COUNTER."
    exit 1
fi

if ! /usr/bin/docker push <dockerhub_repo>/"$DOCKER_IMAGE_NAME:latest"; then
    echo "Docker push failed for 'latest'."
    exit 1
fi

# Output the assigned values (optional)
echo "Local Image Name: $IMAGE_NAME"
echo "Docker Image Name: $DOCKER_IMAGE_NAME"

# Print the image push for reference
echo "Docker image pushed: <dockerhub_repo>/$DOCKER_IMAGE_NAME:$DATE.$NEW_COUNTER"
echo "Docker image pushed: <dockerhub_repo>/$DOCKER_IMAGE_NAME:latest"
```

# Setting up an Alias

To make it easier to use this script, you can set up an alias by adding the following line to your shell configuration file (e.g., `~/.bashrc` or `~/.zshrc`):
```bash
alias dcp='/opt/dcp/dcp.sh'
```
Once you've added this alias, you can simply run `dcp` instead of typing out the full script name.

# Using the Alias

To use the `dcp` alias, simply type:
```bash
dcp [optional arguments]
```
For example:
```bash
dcp myimage latest
```
This will build and push a Docker image with the tag `<dockerhub_repo>/myimage:latest`.
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9