我有一个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
。我做错了什么?
如果Dockerfile中有ENTRYPOINT
,则Command
会被附加为其参数:
指定要在容器中执行的命令。如果指定Entrypoint,则Command将作为参数添加到Entrypoint。有关更多信息,请参阅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""
您有Dockerfile的内容吗?他们很可能你的ENTRYPOINT
脚本没有接收到参数,或者它忽略了它
你能做的事情与此类似。
您有一个入口点脚本,它接收作为参数在aws.json中传递的命令,执行它,然后调用真正的python命令。
或者你可以用类似的东西来代替你的ENTRYPOINT
:
ENTRYPOINT ["/bin/bash"]
默认命令为:
CMD ["python3 ..."]
这样,当在本地运行时,您只能运行python3命令。
在aws中运行时,您可以更改Command并将python附加到末尾,正如Marcin所提到的。两种情况都适用