【问题标题】:docker and elastic beanstalk container stopped unexpectedly and permission denieddocker 和 elastic beanstalk 容器意外停止并且权限被拒绝
【发布时间】:2015-02-19 19:11:57
【问题描述】:

我正在尝试扩展 this docker image,它至少在 docker hub 上成功构建,并至少在 docker hub 上成功构建,该图像的一部分包括一个名为 play 的用户,该用户拥有一个名为 /home/play/Code 的目录,该目录具有 755 个权限.我在 mac 上使用 boot2docker

这是我在本地的 docker 文件

FROM ir1sh/dockeractivator
MAINTAINER Mark Moore
EXPOSE 9000

构建正常,什么时候运行

docker run --rm -it -v "/my/local/dir:/home/play/Code" -p 9000:9000 300b01a6199c

容器正确启动,我在 /home/play/Code 中获得了与用户 root 的会话。如果我将 -u play 添加到该逗号,我会在同一目录中与 play 用户进行会话。

现在,如果我使用他们的 cli 工具将该容器推送到弹性 beanstalk,我会收到以下错误

输出:[CMD-AppDeploy/AppDeployStage0/AppDeployPreHook/04run.sh] 命令失败,错误代码为 1: /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh b07ae15d619ad90441f6f410a31a7d51885151c92cd8675c5d8e47f63b43dd95 Docker 容器在启动后意外退出:Docker container quit 出乎意料地在 2014 年 12 月 21 日星期日 13:36:06 UTC:.检查快照日志 详情..

日志不是很有启发性

现在根据另一个建议,我的 docker 文件中没有 CMD 或 ENTRYPOINT,所以我添加了这些。

FROM ir1sh/dockeractivator
MAINTAINER Mark Moore
EXPOSE 9000
ENTRYPOINT ["/home/play/Code", "-DFOREGROUND"]
CMD []

图像构建,但现在当我尝试使用与上面相同的选项运行 docker run 时,我得到了

exec: "/home/play/Code": 权限被拒绝2014/12/21 13:34:33 错误 来自守护进程的响应:无法启动容器 2703462a68a32e8d774e9b4d8cbc3c809e79f53bb1d08f0398b45436d07546a3: exec: "/home/play/Code": 权限被拒绝

无论我尝试以 root 身份还是 play 身份启动会话,都会发生这种情况。如果我将这个 dockerfile 推送到弹性 beanstalk,我会得到同样的错误,所以它与 boot2docker 无关知道我的权限问题是什么吗?我已尝试将该目录权限更改为 777 无济于事

edit1:以特权身份运行也无济于事

edit2:将 dockerfile 更改为

FROM ir1sh/dockeractivator
MAINTAINER Mark Moore
EXPOSE 9000
CMD ["bash"]

允许我在本地运行容器,但在推送到弹性豆茎后,容器再次意外退出错误

【问题讨论】:

    标签: playframework-2.0 docker amazon-elastic-beanstalk


    【解决方案1】:

    尝试在本地运行时不使用 -it 运行,这会正确复制在弹性 beanstalk 上运行的场景,因为 beanstalk 不会以交互模式运行容器。有些进程不能很好地处理非交互式 shell。当您使用 bash 作为您的 CMD 时,情况肯定就是这种情况。在非交互模式下,bash shell 会立即退出。

    我也认为你还不清楚 EntryPoint 和 CMD 是做什么的,我看到 /home/play/Code 是一个目录,其中的第一个字符串总是需要是可执行文件。

    例如,如果您有 ENTRYPOINT ["A","B"] 和 CMD ["C","D"],这相当于在终端 A B C D 上发出以下命令。一个更好的例子是:

    ENTRYPOINT ["ls","-a","-l"]
    CMD ["/var/log"]
    
    # This maps too
    ls -a -l /var/log
    

    您有两个选项的原因 ENTRYPOINT 不能像 CMD 那样在运行时被覆盖。即我可以 docker 运行以下命令来更改 ls 命令将列出的目录,但我无法更改此容器将运行 ls 命令这一事实

    docker run -it myContainer /tmp
    

    【讨论】:

    • 所以当我省略 -it 并尝试运行时,它不会通过会话进入容器,当我运行 docker ps 时它显示没有正在运行的容器,所以听起来你的怀疑是正确的。所以我不太确定入口点和 cmd 的用途。基本上我只是想让这个容器启动,然后我想用 ansible 配置其余的容器。我可以在本地手动启动 ansible,并计划使用 .ebextensions 命令在 elasticbeanstalk 上执行此操作
    • 是否有一个命令可以替换 bash 命令,它什么都不做,让容器继续运行?
    • docker logs [CONTAINER_NAME/ID] 应该告诉你死去的容器发生了什么。在这种情况下它可能不是很有用,因为通常不处理无头模式的进程也不会很好地记录。 tail -f /some/log/file 将保持容器运行,然后您可以使用 docker exec -it bash 进入它
    • 只要您在预置脚本的最后一步中运行服务器,那么 docker 容器在 beanstalk 中也应该没问题。如果您的服务器没有无头前台模式,您可以使用 Supervisor (docs.docker.com/articles/using_supervisord) 作为脚本中的最终命令。
    • 是的,如果您按照链接的教程进行操作,但只使用 supervisord.conf 的前两行,即 [supervisord] nodaemon=true。当您运行容器时,即使没有交互模式,它也会继续运行。
    猜你喜欢
    • 2021-11-28
    • 2021-07-25
    • 2013-04-28
    • 2020-11-03
    • 2017-03-25
    • 1970-01-01
    • 2018-12-15
    • 2015-05-10
    • 2018-10-01
    相关资源
    最近更新 更多