启动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

posted @ 2021-06-03 14:14  tianyee  阅读(8835)  评论(1编辑  收藏  举报