【问题标题】:"CMD ['/home/user/script.sh']" in docker file doesn't work with docker-composedocker 文件中的“CMD ['/home/user/script.sh']”不适用于 docker-compose
【发布时间】:2015-10-20 05:41:20
【问题描述】:

我有一个 Docker 文件,可以完美构建:docker build -t myfile . 但是当我尝试使用 docker-compose 运行它时 - 它给了我一个错误:

web_1 | /bin/sh: 1: [/home/root/myproject/uwsgi.sh: not found
myproject_web_1 exited with code 127
Gracefully stopping... (press Ctrl+C again to force)

如果我手动启动这个脚本 - 它工作正常。

Dockerfile 看起来像:

FROM ubuntu:14.04

ADD ./myproject/ /home/root/myproject/

WORKDIR /home/root/myproject/

# Some other stuff...

CMD ['/home/root/myproject/uwsgi.sh', 'start' ]

docker-compose.yml:

web:
  build: .
  ports:
   - "8888:8888"
  links:
   - db
db:
  image: mysql

为什么会出现此错误? 谢谢。

【问题讨论】:

  • 好吧,如果它说 uwsgi.sh not found 我会首先使用 bash 并查看它是否存在以及拥有什么所有权和权限...
  • 如果你在 Windows 主机上构建它,在 ADD 或 COPY 后运行 dos2unix

标签: docker dockerfile docker-compose


【解决方案1】:

我稍微简化了你的例子

https://github.com/BITPlan/docker-stackoverflowanswers/tree/master/33229581

并使用:

docker-compose.yml

web:
  build: .
  ports:
   - "8888:8888"

找到。

.
./docker-compose.yml
./Dockerfile
./myproject

docker 构建和运行

docker-compose build
docker-compose run web

我当然明白了

/bin/sh: 1: [/home/root/myproject/uwsgi.sh,: not found

假设这是因为 myproject 目录中没有 uwsgi.sh。

如果我添加 uwsgi.sh 与

echo 'echo $0 is there and called with params $@!' > myproject/uwsgi.sh
chmod +x myproject/uwsgi.sh

并用它测试它

docker-compose run web /bin/bash
ls
cat uwsgi.sh
./uwsgi.sh start

它就在那里并且按预期运行:

root@9f06f8ff8c3b:/home/root/myproject# ls
uwsgi.sh
root@9f06f8ff8c3b:/home/root/myproject# cat uwsgi.sh 
echo $0 is there and called with params $@!
root@9f06f8ff8c3b:/home/root/myproject# ./uwsgi.sh start
./uwsgi.sh is there and called with params start!
 root@9f06f8ff8c3b:/home/root/myproject# 

但是对于 docker-compose run web 我仍然得到

/bin/sh: 1: [/home/root/myproject/uwsgi.sh,: not found

如果我在 Dockerfile CMD 行中添加一个空白:

CMD [ '/home/root/myproject/uwsgi.sh', 'start' ] 

结果是: /bin/sh: 1: [: /home/root/myproject/uwsgi.sh,: 意外操作符

这让我们更接近。作为下一步,我将省略“开始”参数。

CMD [ '/home/root/myproject/uwsgi.sh' ] 

这会导致根本没有输出...

如果我将 CMD 行更改为:

CMD [ "/home/root/myproject/uwsgi.sh", "start" ] 

我明白了

 Cannot start container 
 0b9da138c43ef308ad70da4a7718cb96fbfdf6cda113e2ae0ce5e24de06f07cd: [8]  
 System   error: exec format error

现在您可以继续采用类似爱迪生的方法:

我没有失败。我刚刚发现了 10,000 种行不通的方法。 直到找到

CMD [ "/bin/bash", "/home/root/myproject/uwsgi.sh", "start" ]

让你更接近结果:

 /home/root/myproject/uwsgi.sh is there and called with params start!

CMD 需要一个可执行文件作为第一个参数,例如

https://docs.docker.com/compose/

CMD python app.py

例如。要运行你的 shell 脚本,你需要一个像 bash 这样的 shell。 另见https://stackoverflow.com/a/33219131/1497139

【讨论】:

    【解决方案2】:

    对于其他寻求此错误消息帮助的人:我发现在我的情况下,它是由 CMD 行中缺少逗号引起的。错误状态:

    $ grep ^CMD Dockerfile
    CMD ["/bin/sh" "-c" "hostname"]
    $ docker run --rm -it hostname
    /bin/sh: 1: [/bin/sh: not found
    

    像这样正确输入逗号可以解决问题:

    $ grep ^CMD Dockerfile
    CMD ["/bin/sh", "-c", "hostname"]
    

    【讨论】:

      猜你喜欢
      • 2019-05-24
      • 2019-10-05
      • 2017-03-25
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      相关资源
      最近更新 更多