title: DockerFile
date: 2018-12-15 11:27:03
tags:
- 基础
categories:
- Docker
💠
💠 2025-04-18 09:37:55
mkdir test && cd test && touch Dockerfile
输入如下文本 #随意写的
FROM alpine
MAINTAINER Mythos
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
docker build .
如果成功则会得到一个没有名字的镜像 none:none
docker build -t image:tag .
给镜像指定名字, 注意标签不设置就是默认的latestdocker run --name ContainerName -d image:tag
新建容器来运行镜像Dockerfile
就使用 .
docker build -t image:tag- < 文件名
或者使用-f参数:-f
指向任意位置的文件进行配置 docker build -f /path/to/a/Dockerfile .
-t
如果构建成功 可以指定保存新镜像的image和tag (多个的话就多个 -t就行了,例如 docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
)镜像
的表示,可以通过Dockerfile来描述构建镜像的步骤,且可以自动构建一个容器INSTRUCTION arguments
注意
.dockerignore
文件来忽略不要上传的文件基于某镜像构建,这是整个文件的第一条指令,一定是基于某镜像构建的,如果是空镜像就使用特殊的
FROM scratch
允许多个FROM命令,其后的命令就是基于该FROM的镜像构建的,但是一个dockerfile只能得到一个有名字的镜像(最后一个FROM构建的镜像),之前的FROM就是none:none
FROM image
FROM image:tag
FROM image@digest
如果FROM使用中,找不到对应的版本的镜像,整个Dockerfile就会报错退出
在 17.05 版本开始, 支持分步构建, Multiple stage
例如基于一个编译环境镜像, 编译得到结果文件, 然后基于运行环境, 将结果文件复制过来, 构建成新的镜像, 最终镜像将不包含编译环境
FROM maven:3.5.0-jdk-8-alpine AS builder
RUN mvn clean package
From openjdk:8-jre-alpine
COPY --from=builder target/demo.jar demo.jar
CMD ["java", "-jar", "demo.jar"]
MAINTAINER kuangcp myth.kuang@gmail.com
每条RUN命令在当前镜像的基础上执行指定命令,并提交为新的镜像层,所以尽量将所有命令放在一个RUN里, 便于后续构建时复用缓存和减少层数
RUN command
/bin/sh -C
负责执行,所以就会有限制,必须要有 /bin/sh
RUN ["executable", "param1", "param2" ... ]
一定要双引号(JSON字符串的格式
来解析的)
RUN ["/bin/bash", "-C", "echo hello"]
RUN ["echo","$HOME"]
是不会正常输出的,因为此时不会加载环境变量中的数据
RUN ["sh", "-c", "echo", "$HOME"]
就可以正常输出了当RUN命令执行完毕后,就会生成一个新的文件层。这个文件层会保存在缓存中作为下一个指令的基础镜像存在,如果不需要缓存就加上 --no-cache
注意 apt update 会被Docker缓存,因为缓存的判定是依据命令字符,而不是文件的内容,会有这种奇怪的问题
# Alpine
RUN apk --no-cache add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# Ubuntu 可能需要安装tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata
# Centos
RUN echo "Asia/shanghai" > /etc/timezone;
对于 alpine 以及 Ubuntu ln -s 建立到时间文件的软链接就已经够了, 但是确保没问题就最好还是修改下 时区文件
由于Docker动态分配pod的虚拟ip,所以hosts会动态生成,单纯使用RUN命令在Dockerfile中修改hosts文件是不生效的。
正确方式为:
docker run –add-host host:ip
hostAliases:
- hostnames:
- api.xxxxx.com
ip: 192.168.1.5
- hostnames:
- user.xxxx.cn
ip: 192.168.1.9
# Ubuntu
apt update && apt install tzdata && apt autoclean && rm -rf /var/lib/apt/lists/
# Alpine
apk update && apk add bash &&
关于Java的时区问题
docker run ... -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai
指定 容器启动时默认执行的命令
三种格式
CMD ["executable","param1","param2"]
(like an exec, preferred form) 推荐
CMD ["param1","param2"]
(as default parameters to ENTRYPOINT) 作为默认参数提供给ENTRYPOINTCMD command param1 param2
(as a shell) 作为shell命令 依靠bin/sh -C
执行一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效。
如果用户在docker run
中带了运行的命令,就会覆盖CMD命令
与RUN命令一样如果要环境变量就要使用 sh -C
: CMD ["sh", "-C", "echo $HOME"]
容器入口点
命令设置在容器启动时执行命令 一般用来做初始化容器,或者运行持久软件
ENTRYPOINT echo "Welcome!"
那么每次启动容器都有这个输出ENTRYPOINT java param1 param2 ...
注意这种写法会使用默认shell去解释执行这个命令,即sh进程下才是java进程ENTRYPOINT ["java", "param1", "param2"...]
这种写法则会直接调用java命令ENTRYPOINT ["mysql", "-u", "daemon"]
ENTRYPOINT ["memcached"]
USER daemon
设置环境变量
ENV <key> <value>
ENV name kuang cheng ping
ENV <key>=<value>
ENV name=myth\ kuang
ENV TZ=Asia/Shanghai
ENV命令之后的RUN命令都可以使用这里配置的环境变量
如果docker run --env <key>=<value>
则会覆盖dockerfile中同名key的值
docker run -e
重设环境变量一个ENV命令一个新层,所以也是尽量使用一个ENV命令
ENV TIME_ZONE Asiz/Shanghai
用来定义键值对, 相当于是一个内置的配置文件
LABEL key=value
LABEL version="java 1.8"
LABEL test=other
用来指定一些镜像中使用的参数,例如版本信息
ARG <name> [=<default value>]
$name
docker build --build-arg<name>=<value>
ARG 指令有生效范围,如果在 FROM 指令之前指定,那么只能用于 声明到 FROM 指令中间的命令上。所以多阶段构建使用FROM分离变量
当复制本地目录时,推荐使用copy
copy <src> <dest>
copy ["./log", "${APPROOT}"]
ADD <src> <dest>
VOLUME ["<mountpoint>"]
VOLUME ["/data"]
创建挂载点 用于共享目录WORKDIR /path/to/workdir
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
其实是在 /a/b/c 下执行 pwd健康检查
FROM imageA AS builder
RUN ...
FROM imageB AS final
RUN ...
# 可以引用builder镜像中的文件
COPY --from=builder /path/to/a /app
ENTRYPOINT ["/app"]
FROM ubuntu
MAINTAINER "your email"
RUN apt-get update \
&& apt-get install -ysoftware-properties-common \
&& add-apt-repository ppa:git-core/ppa \
&& apt-get update && apt-get install -y git
ENTRYPOINT ["git"]
docker build -t git:new .
docker run --rm git:new
RUN useradd -ms /bin/bash mythos;\
echo "mythos:jiushi" | chpasswd;
USER mythos
WORKDIR /home/mythos
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )