Dockerfile
1. FROM 指定基础镜像
nginx, redis, mongo, mysql, httpd, php, tomcat
node, openjdk, python, ruby, golang
ubuntu, debian, centos, fedora, alpine
scratch
2. RUN 构建镜像时执行命令
RUN echo '<h1>Hello, gendloop!</h1>' > /usr/share/nginx/html/index.html
RUN ["sh", "-c", "echo '<h1>Hello, gendloop!</h1>' > /usr/share/nginx/html/index.html"]
FROM debian:stretch
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
3. COPY复制
COPY [--chown=<user>:<group>] <source>,... <destination>
COPY [--chown=<user>:<group>] "<source>",... "<destination>"
COPY package.json /usr/src/app/
COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY --chown=gendloop:gendloop files* /mydir/
COPY --chown=gendloop files* /mydir/
COPY EmptyFolder/* /mydir/
4. ADD更高级的复制
5. CMD指定容器默认启动命令
CMD ["sh", "-c", "echo $HOME"]
CMD ["nginx", "-g", "daemon off;"]
6. ENTRYPOINT入口点
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://myip.ip.net" ]
docker run myip
docker run myip -i
FROM ubuntu:18.04
ENTRYPOINT [ "echo" "Hello" ]
CMD [ "gendloop" ]
docker run myubuntu
docker run myubuntu "World"
7. ENV环境变量
ENV MY_NAME gendloop
ENV MY_HOME /app
RUN mkdir -p $MY_HOME
CMD echo "Hello, $MY_NAME! Welcome to $MY_HOME"
8. ARG构建参数
ARG <var>[=<default_value>]
docker build --build-arg <var>=<value>
ARG VERSION=v1.0.0
RUN echo "Building version $VERSION"
docker build --build-arg VERSION=v1.2.3 -t myapp .
9. VOLUME定义匿名卷
VOLUME /data
docker run -d -v mydata:/data xxx
10. EXPOSE声明端口
EXPOSE 3000 8080
EXPOSE 443/tcp
EXPOSE 443/udp
11. WORKDIR指定工作目录
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd # /a/b/c
12. USER指定当前用户
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]
13. HEALTHCHECK健康检查
RUN nginx
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/* \
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
docker build -t myweb:v1
docker run -d --name web -p 80:80 myweb:v1
docker inspect --format '{{json .State.Health}}' web | python -m json.tool
14. ONBUILD为他人做嫁衣
FROM node:slim
RUN mkdir /app
WORKDIR /app
COPY ./package.json /app
RUN [ "npm", "install" ]
COPY . /app/
CMD [ "npm", "start" ]
FROM node:silm
RUN mkdir /app
WORKDIR /app
CMD [ "npm", "start" ]
FROM my-node
COPY ./package.json /app
RUN [ "npm", "install" ]
COPY . /app/
FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]
FROM my-node
15. LABEL指令
LABEL org.opencontainers.image.authors="gendloop"
LABEL org.opencontainers.image.documentation="https://yuque.com/gendloop"
LABEL org.opencontainers.image.references="https://github.com/opencontainers/image-spec/blob/master/annotations.md"
16. SHELL指令
SHELL ["/bin/sh", "-cex"]
ENTRYPOINT nginx
SHELL ["/bin/sh", "-cex"]
CMD nginx
17. References
- https://yeasy.gitbook.io/docker_practice
- https://docs.docker.com/build/building/best-practices/
- https://github.com/docker-library/docs