The Ultimate Docker Cheat Sheet
devopscycle.com
devopscycle.com
- Security warnings:
like: Note that ports which are not bound to the host (i.e., -p 5432:5432 instead of -p 127.0.0.1:5432:5432) will be accessible from the outside. This also applies if you configured UFW to block this specific port, as Docker manages its own iptables rules. https://docs.docker.com/network/packet-filtering-firewalls/
- using trivy scanner: "trivy image --ignore-unfixed ... "
---------------------
Why the security is important?
- https://sysdig.com/blog/zoom-into-kinsing-kdevtmpfsi/ : "Some of those Docker engines weren’t configured with authentication, which make them a perfect target for Kinsing attacks."
- https://sysdig.com/blog/cloud-defense-in-depth/ ( JULY 4, 2023: Cloud Defense in Depth: Lessons from the Kinsing Malware )
- https://thenewstack.io/kinsing-malware-targets-kubernetes/ ( Jan 13th, 2023 , Kinsing Malware Targets Kubernetes )
In general, I think it's also a good general idea to keep yourself to one, maximum two RUN statements per image - I've seen it way too many times that some junior writes RUN apt update, RUN apt install -yf foo, RUN apt clean... which will leave all the intermediate crap from apt still part of the final image as the third command (the apt clean) will just set tombstone files [1][2] in the layer's overlay image.
(Side note, it boggles my mind why you can't tell Docker to flatten multiple subsequent "metadata only" layers like LABEL/ENV/CMD/ENTRYPOINT/ARG into one single one)
Additionally, I'd add a warning for multi-stage builds that ARG needs to be redeclared in following stages (a simple ARG xyz is sufficient, no need to repeat a default value), and that CMD/ENTRYPOINT set in the first stage for some reason tend to be overwritten in a stage that is FROM first-stage.
[1] https://github.com/aws-samples/linux-container-primitives-pr...
[2] https://jvns.ca/blog/2019/11/18/how-containers-work--overlay...
See:
"Docker Hub image for version 12.4 contains a cryptominer [Confirmed!]"
1. how many stages there are
2. how long they are
3. the dependencies
Taking the example from the article:
FROM node:18-alpine as builder
WORKDIR /app
COPY ./package* .
RUN npm ci
COPY . .
RUN npm run build:client
FROM nginxinc/nginx-unprivileged:1.24 as serve
COPY --from=builder /app/dist /var/www
COPY --from=builder /app/.nginx/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
IMHO it's just so more legible. Without this, it feels like writing C without indentation. Unfortunately the Jetbrains IDEs fail to properly apply syntax highlighting. // EXEC PGM=IEFBR14`docker run --entrypoint /bin/sh -it --rm the-image` IIRC
docker run -it --rm ubuntu:22.04
I assume that the default command for this image is /bin/shDo you do it this way to override the image's entrypoint unconditionally?
cached Jan-14
https://web.archive.org/web/20240114095842/https://devopscyc...
I would like to know what the difference is between a stopped container and an image.
So a stopped container could have stuff in it that doesn't exist in the image, as the container has gone through the states of "created > running > stopped" and during the running, you can mutate stuff in the container.
On the other hand, an image never actually runs, only containers created from that image.
I guess you could compare it to VMs as well, where you can have templates/other instances, and clone new instances from that template/other instance. Kind of the same too.