# Cheat Sheet

## Container management

### Avoid container termination after executing CMD or Entrypoint

If you have a Dockerfile similar to this one:

```
FROM nginx
COPY my-custom-script.sh /
ENTRYPOINT ["/my-custom-script.sh"]
# OR
# CMD /my-custom-script.sh
```

And after **my-custom-script.sh** exits, docker stops the container, you can fix the problem as follows.

Fist, make sure you are using **COPY** instead of ADD in your Dockerfile to copy your script.

Edit **my-custom-script.sh** and add the following line at the **end**:

```bash
...
# Run all command line arguments
exec "$@";
```

Then make sure to use a command when running your container, for example **/bin/bash**

```bash
docker run \
  -tid \
  -p 8080:8080 \
  --name test \
  my-custom-image \
  /bin/bash
```

### Bash TTY connect

```bash
docker exec -ti CONTAINER-NAME-HERE /bin/bash
```

### Run container

```bash
docker run \
  -tid \
  --name test \
  -p 8080:8080 \
  -e MY_VAR='MY-VALUE' \
  nginx
```

### Run docker-in-docker

```bash
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker
```

### Start container on boot

Run your container with `--restart=always` flag.&#x20;

Or add the the flag to an existing container:

```bash
docker update --restart=always <container>
```

## CLI tricks

### Attach

```bash
docker attach CONTAINER-NAME
```

{% hint style="info" %}
If you press CTRL+C to exit it will stop the container.\
To exit without stopping the container press CTRL+P then CTRL+Q
{% endhint %}

## Image management

### Create image from container

```bash
docker commit CONTAINER-NAME NEW-IMAGE-NAME
```

### Create image from Dockerfile

```bash
docker build -t NEW-IMAGE-NAME .
```

### Create image from AWS AMI

#### Get your AMI snapshot ID

Access your AWS console and go to **EC2**, **AMIs**. Find your AMI and check its **Block Devices**, for example:&#x20;

```bash
/dev/sda1=snap-081e01478359d5bec:30:true:gp2
```

**snap-081e01478359d5bec** is the **AMI snapshot ID**, which will be used as the source for a new device.

#### Create a new volume from your AMI snapshot ID

In your AWS console go to **Snapshots**. **Filter** using your **snapshot ID**, for example: **snap- 081e01478359d5bec**.

**Right click on it**, then select **Create Volume**. Add a tag key **Name** and input your new volume’s name.

#### Attach your new volume to an instance

Launch a new instance or use an existing one.

{% hint style="warning" %}
Keep in mind the instance must have enough space to store a temporary tar le from your AMI volume.
{% endhint %}

In your AWS console go to **Volumes**. **Filter** by your **Volume Name** (you created previously).

**Right click on it**, then select **Attach Volume**.

Select your instance and choose a **Device**, for example: /dev/sdf

Click on **Attach**.

#### Mount your new volume

SSH connect to your instance and mount the volume you just created.

```bash
mount /dev/xvdf1 /mnt
```

{% hint style="info" %}
Note your Device was renamed to **/dev/xvdf**
{% endhint %}

#### Install Docker

Install Docker in your instance.

#### Create Docker image

SSH connect to your instance and mount the volume you just created.

```bash
tar -c -C /mnt/ . | docker import - YOUR-IMAGE-NAME
```

{% hint style="info" %}
Replace **YOUR-IMAGE-NAME**
{% endhint %}

This command might take a while depending on the size of your volume.

#### Testing

List your docker image&#x73;**.** Find YOUR-IMAGE-NAME and get its Image ID.

Run a container from your new image.

```bash
docker run -tid dd5935d36306 /bin/bash
```

#### **Cleanup**

If everything is OK you can umount your volume:

```bash
umount /mnt
```

Then go to your **AWS Console**, **Volumes**. Find the volume you created previously, **right click on it** then select **Detach Volume**. Then **right click on it** again then select **Delete Volume**.

#### References

<https://stackoverflow.com/a/35124911>

### Cleanup dangling images

```
docker rmi -f $(docker images -f "dangling=true" -q)
```

Or.. the `docker system prune` command will remove all stopped containers, all dangling images, and all unused networks:

```
docker system prune
```

## Inspect

### List run command used

```bash
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER
```

### Show mounted volumes

```bash
docker inspect -f '{{ .Mounts }}' containerid
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.devops.buzz/public/docker/cheat-sheet.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
