解决方案:
1.py
和2.py
糅合成一个1.py
,进入容器内,执行2.py
(此方法docker logs xx
查看不到2.py
的运行日志)python 1.py && python 2.py
> 1.sh
, Dockerfile定义ENTRYPOINT ["/xx/1.sh"]
(此方法可以看到两个的日志)supervisor
(未尝试)我采用的第一种方法
第三种方法可能会遇到的坑(针对我这种一点shell脚本不懂的人来说)
1.Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"1.sh\": executable file not found in $PATH": unknown.
解决方法:ENTRYPOINT sh写绝对路径 , ENTYPOINT ["/root/1.sh"]
2.Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/code/1.sh\": permission denied": unknown.
解决方法:给sh文件添加执行权限 RUN chmod +x /code/1.sh
(+x中间不要加空格)
3.standard_init_linux.go:207: exec user process caused "exec format error"
两个原因:
#!/bin/bash
在1.sh文件第一行添加#!/bin/bash
感觉V友们的帮助!
PS:v2ex 增加附言的时候预览功能坏掉了, 所以上面的排版有点糟糕,sry (Chrom 版本 73.0.3683.103(正式版本) (64 位))
1
tony601818 2019-06-18 18:11:07 +08:00 via Android
用`&&`配合反斜杠换行转译,或者写 shell script
|
2
HuHui 2019-06-18 18:13:28 +08:00 via Android
分俩镜像
|
3
endoffight 2019-06-18 18:19:02 +08:00 via Android 1
1,托管程序,比如 supervisor
2,分成两个容器 3, 让第一个 cmd 后台运行,然后&&接 cmd2 |
4
hzwjz 2019-06-18 18:21:08 +08:00
你回顾一下,你是怎么在 terminal 中怎么执行那两个 py 文件的,把两命令按前后顺序放到 xx.sh 。再配合 entrypoint 即可
[entrypoint]( https://docs.docker.com/engine/reference/builder/#entrypoint) |
5
liqingcan 2019-06-18 18:21:35 +08:00
这两个都是在启动镜像的时候执行吗?是的话只能写 sh 脚本。如果不是的话。是在打包镜像的时候就可以执行的用 RUN 命令
|
7
ysjiang4869 2019-06-18 19:11:54 +08:00 via Android 1
docker 官网推荐 supervisor 或者自己写一个脚本执行多程序;执行多程序不建议放到后台,因为可能要考虑日志和检测进程退出后退出容器,自己写过 shell 脚本如果需要可以给你参考
|
8
caneman OP @ysjiang4869
我创建了一个 1.sh, 里面写的是`python 1.py && python 2.py`在 linux 里面测试这个 sh 正常运行 但是我在 Dockerfile 中设置 ENTRYPOINT ["/xx/1.sh"]的时候会报 `standard_init_linux.go:207: exec user process caused "exec format error"` 这个错误是怎么回事?查阅了一些资料,都说是 sh 文件类型的问题,但是我通过 vim 的 :set ff 查看了 1.sh 的文件类型,是 unix 的没错,我想问一下是因为我的脚本写的有问题吗?不太懂这一块 |
9
caneman OP @ysjiang4869 解决了,我的 sh 没有加`#!/bin/bash`这个.....感觉是不是就跟把 main 写成了 mian 一样的错误?...好低级...
|