FROM
指定 base images
FROM centos:7.4.1708
MAINTAINER
設置鏡像的作者
MAINTAINER [email protected]
我們設置了鏡像的作者後,可以通過 docker inspect 命令查看鏡像的信息,裏面包含有作者信息。
[root@localhost dockerfile-instruction]# docker inspect c89334650819
[
{
"DockerVersion": "18.03.1-ce",
"Author": "[email protected]",
...忽略其它信息
"Metadata": {
"LastTagTime": "2018-11-12T22:05:51.772312473+08:00"
}
}
]
COPY
複製本地主機的 src到容器中的 dest ,src必須在上下文中,一般情況下,將本地主機的一個包含Dockerfile的目錄中的所有內容作爲上下文,如docker/install。當使用本地目錄爲源目錄時,推薦使用 COPY 。
下面的/root/dockerfile-instruction是build context
COPY /root/dockerfile-instruction/install /app/install
ADD
與 COPY 類似,不同的是,如果src的文件是identity, gzip, bzip2,xz,tar.gz,tgz等類型的文件將被添加tar -x命令,進行解壓
EXPOSE
向外界暴露端口。這樣就可以通過容器的ip地址+port訪問到容器。
在這裏,我們不得不提docker run命令中的 -p 參數。docker run中的-p參數是對容器中的端口映射到host端口中,這樣我們既可以通過容器的ip地址+port訪問,也可以通過host的IP+端口訪問到容器中的服務。
舉個例子:
有一個helloworld的springboot服務,寫了一個dockerfile文件,暴露了8080端口
FROM openjdk:8u181-jdk-alpine
VOLUME /app/springboot-docker
ADD springboot-docker-1.0.jar /app/springboot-docker/app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/springboot-docker/app.jar"]
當我們通過dockerfile構建鏡像並通過命令運行後
docker run -d --name springboot-docker springboot-docker
我們可以通過以下命令獲取到容器的IP地址
docker inspect springboot-docker
這時,我們可以通過下面的命令訪問到服務,172.17.0.2是該容器的IP
curl 172.17.0.2:8080/home
CMD
容器啓動時運行指定的命令,CMD指令支持的格式
- CMD ["executable","param1","param2"] 。推薦格式
- CMD ["param1","param2"] 。爲ENTRYPOINT指令提供參數,此時的 ENTRYPOINT 指令需要使用 Exec 格式。其用途是爲ENTRYPOINT 指令設置默認的參數
- CMD command param1 param2 。執行shell內部命令
每個Dockerfile最多只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。如果用戶通過dcoker run
命令啓動容器,將會覆蓋掉 CMD 指定的參數代替。
下面以格式(1)距離說明,格式(2)將在 ENTRYPOINT 指令中舉栗子。
Dockerfile如下,最後一行加入了CMD命令
FROM centos:7.4.1708
MAINTAINER [email protected]
CMD ["/bin/bash","-c","echo hello,docker"]
當我們運行該容器時,它會馬上運行最後的命令。
[root@localhost dockerfile-instruction]# docker run -it dockerfile-instruction
hello,docker
如果通過下面的命令運行docker,則CMD參數會被替代
[root@localhost dockerfile-instruction]# docker run -it dockerfile-instruction echo bye
bye
ENV
設置環境變量,它可作用的其它指令:
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
也就是說,在這些指令中,可以通過 ${ENV_VALUE}替換
WORKDIR
設置工作目錄,設置了工作目錄,它將會作用於該指令後面的RUN
, CMD
, ENTRYPOINT
, COPY
, ADD 指令。