docker基础_Dockerfile

Dockerfile

[]: https://docs.docker.com/language/python/build-images/ "docker官方文档"

以python为例(docker官方还提供了java、go、nodejs) 学习dockerfile文件的编写(当运行docker build .的时候会先运行一个临时容器将自己编写的内容放到临时容器中 然后再生成镜像)

生成镜像

docker基础_Dockerfile
在某个路径下有以下三个文件

beginner@beginner-virtual-machine:~/test$ ls
app.py  Dockerfile  requirements.txt

Dockerfile

FROM python:3.8-slim-buster  #以这个镜像做为基础 在这个镜像的基础上构建我们自己的内容

WORKDIR /app  # 将新镜像的工作目录变成/app(如果没有就新建),当运行镜像的时候 就会进到这个目录下

COPY requirements.txt requirements.txt # 将当前路径下的requirement.txt复制到/app/requirements.txt
RUN pip3 install -r requirements.txt # 容器运行pip3 install 安装所需要的包

COPY . .  # 将当前路径下的所有内容复制到/app下

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"] # 运行python3 -m flask run --host=0.0.0.0命令

app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'

requirements.txt

Flask==2.0.2

执行docker命令生成镜像

docker build --tag python-docker .  # .是指当前的路径
 [internal] load build definition from Dockerfile
 => transferring dockerfile: 203B
 [internal] load .dockerignore
 => transferring context: 2B
 [internal] load metadata for docker.io/library/python:3.8-slim-buster
 [1/6] FROM docker.io/library/python:3.8-slim-buster
 [internal] load build context
 => transferring context: 953B
 CACHED [2/6] WORKDIR /app
 [3/6] COPY requirements.txt requirements.txt
 [4/6] RUN pip3 install -r requirements.txt
 [5/6] COPY . .
 [6/6] CMD [ "python3", "-m", "flask", "run", "--host=0.0.0.0"]
 exporting to image
 => exporting layers
 => writing image sha256:8cae92a8fbd6d091ce687b71b31252056944b09760438905b726625831564c4c
 => naming to docker.io/library/python-docker

dockerfile指令详解

docker基础_Dockerfile

FROM  #基础镜像,一切从这里开始构建
MAINTAINER  #镜像是谁写的,姓名+邮箱
RUN  # 镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口配置
RUN 
CMD  #指定这个容器启动的时候要运行的命令,只有最后一个会生效,一个Dockerfile只能有一个CMD命令,如果有多个,只有最后一个CMD命令生效。
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承的Dockerfile 这个时候就会运行onbuild指令
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV#构建的时候设置环境变量

如果有多个CMD只会执行最后一个!!!

举个例子(python3.8的最后一个cmd是 CMD ["python3"])

beginner@beginner-virtual-machine:~/test$ docker image ls
REPOSITORY                TAG               IMAGE ID       CREATED          SIZE
test                      1.0               5535c3a6ec24   48 minutes ago   680MB
python3.8_zyh             3.0               21451ed8e840   19 hours ago     812MB
python3.8_zyh             latest            c8ee23b16690   20 hours ago     422MB
python3.8_zyh             1.0               a7abd70e6690   29 hours ago     180MB
tomcat                    latest            fb5657adc892   2 weeks ago      680MB
redis                     6.2.6             7614ae9453d1   2 weeks ago      113MB
python                    3.8-slim-buster   5cc8cb0c433a   2 weeks ago      114MB
ubuntu                    latest            ba6acccedd29   2 months ago     72.8MB
redis                     latest            7faaec683238   2 months ago     113MB
centos                    latest            5d0da3dc9764   3 months ago     231MB
elasticsearch             7.7.0             7ec4f35ab452   20 months ago    757MB
mobz/elasticsearch-head   5                 b19a5c98e43b   5 years ago      824MB

beginner@beginner-virtual-machine:~/test$ docker run -it 5cc8c echo 1
1
beginner@beginner-virtual-machine:~/test$ docker run -it 5cc8c 
Python 3.8.12 (default, Dec 21 2021, 11:15:53) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

上一篇:解决 docker 容器时间与本地时间不一致


下一篇:Docker8_3:Docker容器数据卷:DockerFile文件挂载(一般都用这个)