如何获取命令以从 Elastic Beanstalk 上的 Dockerfile.aws.json 运行?
Posted
技术标签:
【中文标题】如何获取命令以从 Elastic Beanstalk 上的 Dockerfile.aws.json 运行?【英文标题】:How do I get a Command to run from a Dockerfile.aws.json on Elastic Beanstalk? 【发布时间】:2020-10-30 06:18:57 【问题描述】:我有一个Dockerfile
和一个Dockerfile.aws.json
:
"AWSEBDockerrunVersion": "1",
"Ports": [
"ContainerPort": "5000",
"HostPort": "5000"
],
"Volumes": [
"HostDirectory": "/tmp/download/models",
"ContainerDirectory": "/models"
],
"Logging": "/var/log/nginx",
"Command": "mkdir -p /tmp && axel https://example.com/models.zip -o /tmp/models.zip"
但是当我部署时,它没有运行我指定的Command
。我做错了什么?
【问题讨论】:
【参考方案1】:如果您的 Dockerfile 中有 ENTRYPOINT
,则 Command
将作为其 arguments 附加:
指定要在容器中执行的命令。如果您指定一个入口点,那么命令将作为入口点的参数添加。有关详细信息,请参阅 Docker 文档中的 CMD。
因此,您的命令mkdir -p /tmp ...
将用作python3 -m flask run --host=0.0.0.0
的参数,从而导致错误。这可以解释您遇到问题的原因。
我最初尝试使用您的 Command
结构重新创建问题,但遇到了一些问题。有效的是通过以下方式使用Command
:
"Command": "/bin/bash -c \"mkdir -p /tmp && axel https://example.com/models.zip -o /tmp/models.zip\""
我的Dockerfile
没有Entrypoint
。因此,要运行您的 python,您可以执行以下操作(假设其他所有内容都正确):
"Command": "/bin/bash -c \"mkdir -p /tmp && axel https://example.com/models.zip -o /tmp/models.zip && python3 -m flask run --host=0.0.0.0\""
【讨论】:
【参考方案2】:你有 Dockerfile 内容吗?
很可能他们的ENTRYPOINT
脚本没有接收到参数,或者忽略了它。
你可以做的类似于this。
你有一个入口点脚本,它接收作为参数传入 aws.json 的命令,执行它,然后调用你真正的 python 命令。
或者你可以用类似这样的东西替换你的ENTRYPOINT
:
ENTRYPOINT ["/bin/bash"]
你的默认命令是:
CMD ["python3 ..."]
这样在本地运行时只运行python3命令。
如 Marcin 所述,在 aws 中运行时,您可以更改命令并将 python 附加到末尾。两种情况都有效
【讨论】:
在我的Dockerfile
中,我有:ENTRYPOINT python3 -m flask run --host=0.0.0.0
但我想在 ENTRYPOINT
之前运行 Command
我编辑了我的答案。基本上你可以覆盖入口点来执行之前的命令。
那么在我的Dockerfile
中,我应该将我的ENTRYPOINT
更改为某个shell 脚本,然后在我的Dockerfile.aws.json
中,我应该有"Command": "--deploy"
?以上是关于如何获取命令以从 Elastic Beanstalk 上的 Dockerfile.aws.json 运行?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取数据以从 NSURLSessionDataTask 返回