> For the complete documentation index, see [llms.txt](https://www.devops.buzz/public/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.devops.buzz/public/docker/cheat-sheet.md).

# 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
```
