启动docker时候怎么向内部程序传入参数
启动docker的命令是docker run ******************
他有好多的参数,具体看 https://www.runoob.com/docker/docker-run-command.html,我们想要传参的话使用的是 -e
需要注意的一点是docker run 命令后面内容的先后顺序,必须 一定 要把镜像名字放到最后!!!
举个例子 : docker run -it -d --name my_container -e PARAMS="我是参数" my_image # 橙色这些参数位置随意, 蓝色(即镜像名字一定放最后)
我们这里实现传参是通过环境变量实现的,这里的 -e PARAMS="我是参数" ,PARAMS是在Dockerfile中指定的
我举个简单的例子 , 假设我要将tttt文件中的代码创建docker,tttt文件中有ttt.py文件(启动文件) ,此时 Dockerfile需要与tttt文件夹在同一目录下
# ttt.py 如下
from sys import argv import os if "__main__"==__name__: print(argv[1]) print(type(argv[1])) print("Hello World!")
# Dockerfile 如下:
FROM docker.io/python:3.6MAINTAINER tianye # 设置容器时间 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone ENV LANG C.UTF-8 # 设置编码 ENV PATH=$PATH:/usr/local/lib/python3.6/ ENV PYTHONPATH $PATH # 配置环境变量 ENV PARAMS="" # 给我们要传的参数一个初始值 #代码添加到code文件夹 ADD ./tttt/ /test/code/tttt/ #设置code文件夹为工作目录 WORKDIR /test/code/tttt/ CMD python3 ttt.py $PARAMS
# 创建镜像并启动容器
docker build -t my_image . docker run -it -d --name my_container -e PARAMS="hahaha" my_image # my_image 放最后 这里hahaha 加不加引号 无所谓 docker logs -f --tail 200 my_container
Dockerfile中 最后一行 $PARAMS 会解析为一个变量获取其值,也就是 docker run传入的参数 "hahaha", 在python程序中通过 argv[1] 就可以获取到我们传入的"hahaha" !
!!!需要注意的一点是Dockerfile 中CMD的用法,如果我们不传参那么写法有很多
如: CMD ["python3", "ttt.py"] CMD [python3, ttt.py] CMD "python3" "ttt.py" CMD python3 ttt.py 都没问题
但是要传参的话: 我们的参数 $PARAMS 是万万不能用 " " 的,不然Dockerfile会认为是普通字符串
CMD ["python", "ttt.py", $PARAMS] (×) 原因可能是字符串和变量放到一个列表时,字符串优先级高,直接将 $PARAMS当作一个字符串处理
CMD [python3, ttt.py, $PARAMS] (×)
CMD "python3" "ttt.py" $PARAMS (√,推荐!)
CMD python3 ttt.py $PARAMS (√)
CMD [] 形式,中括号中 必须用逗号分割; 如果不用中括号,不能用逗号分割! OK 结束!
参考:https://blog.csdn.net/qq_38983728/article/details/98741935
https://www.runoob.com/docker/docker-run-command.html