demo简介
-
项目目录
. ├── Dockerfile ├── fun.py ├── requirements.txt
-
fun.py
from cowpy import cow print(cow.milk_random_cow("Hello ,World"))
-
requirements.txt
cowpy==1.1.0
-
Dockerfile
FROM python:alpine LABEL maintainer="jack@163.com" LABEL description="this is simple example" WORKDIR /app COPY requirements.txt ./ RUN pip install -i https://pypi.douban.com/simple --no-cache-dir -r requirements.txt COPY . . CMD ["python","fun.py"]
构建命令
docker build -t jack/fun:v1 . && docker run --rm -it jack/fun:v1 /bin/sh
- 在
Dockefile
目录执行 - 最后的 . 代表当前目前
Dockerfile详解
FROM python:alpine
-
FROM
指定base
镜像 -
往往在一个
dockerfile
中只有一个FROM
指定(多阶段构建除外) -
格式:
镜像名:版本
LABEL maintainer="jack@163.com"
LABEL description="this is simple example"
-
LABEL
指定docker
镜像中的元数据信息 -
maintainer
镜像维护者,description
描述信息
WORKDIR /app
-
WOCKDIR相当于cd命令,切换到容器中的某一目录
-
如果指定目录不存在,那么会自动化创建,以上命令是容器内新建一个app目录,并切入
-
如果两个
WORKDIR
, 先WORKDIR /app
再WORKDIR one/
相当于进入了/app/one/
目录,会在上一个WORKDIR进入的基础上进入下一级目录
COPY requirements.txt ./
-
COPY
相当于cp
复制命令,作用是复制宿主机的目录或者文件到容器指定目录中 - 第一个参数:宿主机的目录或者文件(相对路径或者绝对路径)
- 第二个参数:容器中的目录或者文件(相对路径或者绝对路径)
-
./
代表上一步切入的/app
目录 - 如果写成
./dir
则会把requirements.txt
复制过来并更名dir
文件 - 如果写成
./dir/
才是复制到app/dir/
下
-
ADD one.zip ./
ADD http://img.baidu.com/asslirengk.png ./
- ADD作用和COPY类似
- 如果第一个参数是本地的压缩文件,则复制到容器后会自动解压
- 如果第一个参数是远程的路径,会自动下载,将下载后的文件复粘贴到容器中
RUN pip install -i https://pypi.douban.com/simple --no-cache-dir -r requirements.txt
- RUN 在容器中执行linux命令
-
--no-cache-dir
不缓存 - 多个RUN 命令,可以用
&&
链接,可避免创建多层
ENV username=jack password=123456
- 在容器内创建全局环境变量
- 创建容器后可进入容器输入
env
验证
VOLUME /app
-
VOLUME
指定运行容器时,需要映射出去的目录 - 如果
Dockerfile
没有用VOLUME
指定则docker run
时候就不能用-v
把目录映射出去,VOLUME
相当于在Dockerfile
中提前声明可以映射的目录
EXPOSE 8080
-
EXPOSE
相当于指定容器运行时,需要映射出去的端口号(容器中) - 如果
Dockerfile
没有用EXPOSE
指定则docker run
时候就不能用-p
把目录映射出去,EXPOSE
相当于在Dockerfile
中提前声明可以映射的端口
USER root
- 设置运行其他命令的用户
CMD ["python","fun.py"]
-
CMD
在容器运行时,会自动执行指令 -
可以输入
shell
类型的命令,如:CMD python fun.py
-
可以输入
exec
类型的命令 ["指定","参数1","参数2"],推荐使用 -
如果有多个CMD命令,那么只会运行最后一个
-
如果在运行容器的时候
docker run
有指定命令的话,那么dockerfile中的CMD
指令会被忽略
ENTRYPOINT ["cat","/etc/passwd"]
-
ENTRYPOINT
和CMD
类似 - 如果在运行容器的时候
docker run
有指定命令的话,那么dockerfile中的ENTRYPOINT
指令不会被忽略,外面的指定会作为参数传递给ENTRYPOINT
ENTRYPOINT ["ping"]
CMD ["192.168.1.99"]
-
ENTRYPOINT
和CMD
配合使用,CMD
会作为ENTRYPOINT
的默认参数 - 运行
docker run ..... /bash/sh 192.168.1.92
就是传递参数覆盖CMD
RUN
与CMD
和ENTRYPOINT
的联系与区别
- 都是运行命令
-
RUN
是构建镜像结构的命令,比如安装依赖 -
CMD
和ENTRYPOINT
的更多的是执行容器内部内容的命令
网友评论