Dockerfile 编写

DockerFile

dockerfile 是用来定制镜像的

dockerfile是一个文本文件,其中包含了一条条的指令,一条指令构建一层Engine image

  • 第一句必须是FROM 来引用基础镜像

  • RUN 执行命令 像shell一样执行脚本

  • 构建redis镜像

FROM debian:stretch

RUN 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

  • 在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。(每RUN一次都是一层镜像)
  • 直接用 Git repo 进行构建

docker build https://github.com/twang2218/gitlab-ce-zh.git#:11.1

  • copy 拷贝文件到上下文中进行构建 需要提前指定上下文位置

docker build -t nginx:v3 . .就是上下文位置

COPY [--chown=:] <源路径>... <目标路径>

  • ADD只适合添加压缩文件进入镜像

    ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
  • 用给定的 tar 压缩包构建

$ docker build http://server/context.tar.gz


容器没有后台概念


  • CMD

CMD ["nginx", "-g", "daemon off;"]

CMD [ "sh", "-c", "echo $HOME" ]
FROM ubuntu:18.04
RUN apt-get update
&& apt-get install -y curl
&& rm -rf /var/lib/apt/lists/*

  • entrypoint
    ENTRYPOINT [ "curl", "-s", "https://ip.cn" ]

设置可改变的参数

  • env

env 设置环境变量
ENV <key1>=<value1> <key2>=<value2> ...

ENV VERSION=1.0 DEBUG=on
NAME="Happy free"

VOLUME /data 可以挂载一个匿名的卷之后可以通过其他的卷来代替
docker run -v mydata:/data 将mydata代替data

WORKDIR 指定工作目录

  • user

RUN groupadd -r redis && useradd -r -g redis redis
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64" \

&& chmod +x /usr/local/bin/gosu \

&& gosu nobody true

# 设置 CMD,并以另外的用户执行

CMD [ "exec", "gosu", "redis", "redis-server" ]

  • ONBUILD 前缀 只有当当前镜像作为基础镜像的时候才会被执行

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×