docker 和 elastic beanstalk 容器意外停止并且权限被拒绝

Posted

技术标签:

【中文标题】docker 和 elastic beanstalk 容器意外停止并且权限被拒绝【英文标题】:docker and elastic beanstalk container stopped unexpectedly and permission denied 【发布时间】: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"]

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

【问题讨论】:

【参考方案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。当您运行容器时,即使没有交互模式,它也会继续运行。

以上是关于docker 和 elastic beanstalk 容器意外停止并且权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 和 Docker 启动错误

Elastic Beanstalk、Docker 和持续集成

Elastic Beanstalk 上的 Docker + Django

使用 Dockerrun.aws.json 和 Elastic Beanstalk 命名 Docker 容器

Node.js 和 Docker - Elastic Beanstalk 502 错误网关

docker 和 elastic beanstalk 容器意外停止并且权限被拒绝