docker 文件中的 "CMD ['/home/user/script.sh']" 不适用于 docker-compose

"CMD ['/home/user/script.sh']" in docker file doesn't work with docker-compose

我有一个 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)

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

Docker文件 看起来像:

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

为什么我会收到这个错误? 谢谢。

我稍微简化了你的例子

https://github.com/BITPlan/docker-Whosebuganswers/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 [=14=] 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 [=16=] 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 运行 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,: 意外的运算符

这让我们更亲近了。作为下一步,我将省略 "start" 参数。

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 脚本,您需要一个 shell,例如 bash。 另见

对于寻求此错误消息帮助的其他人:我发现在我的情况下,这是由 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"]