首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pycharm命令

Pycharm命令
EN

Stack Overflow用户
提问于 2020-03-20 09:11:09
回答 1查看 180关注 0票数 1

Professional 2019.3

Ubuntu 18.04

我想在容器中调试python脚本。我知道下面的例子是过分的,但我想使它尽可能简单。如何将入口点添加到Dockerfile中?

docker-compose.yml:

代码语言:javascript
复制
version: '3'
services:
    python:
        build: .
        container_name: ppd

文档:

代码语言:javascript
复制
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
    python3-pip
ENTRYPOINT ["sleep", "5"]

app.py:

代码语言:javascript
复制
from time import sleep
for i in [1, 2, 3, 4, 5]:
    sleep(2)
    print(i)

基于pycharm配置的I

如果我在没有ENTRYPOINT的情况下运行项目,那么一切都很好:

docker ps -a --no-trunc --format {{.Names}}{{.Command}} | grep ppd ppd "python3 -u /opt/project/build/app.py"

它似乎提供了CMD命令,因为当我将CMD添加到app.py时,它会被docker忽略。

当我在app.py中添加入口点并启动容器时,我看到:

docker ps -a --no-trunc --format {{.Names}}{{.Command}} | grep ppd ppd "sleep 5 python3 -u /opt/project/build/app.py"

如何将Dockerfile中的入口点与py魅力CMD结合起来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-20 09:57:26

如果在您的Dockerfile中将ENTRYPOINT更改为CMD,则一切都将正常工作。

ENTRYPOINT不是Dockerfile中的必需命令。您通常需要至少一个ENTRYPOINTCMD,但没有使用其中一个或另一个的具体要求。如果两者都指定,ENTRYPOINT

例如,在docker run中,在创建容器时很容易重写CMD

代码语言:javascript
复制
docker run --rm myimage \
  python app.py
docker run --rm myimage \
  ls -lrt /app

这似乎也是PyCharm正在做的事情;它还匹配Docker中的command:选项。

由于命令部分只是附加到入口点部分,所以如您所示,指定ENTRYPOINT可能会导致一些奇怪的行为,您需要一些尴尬的解决方案。

代码语言:javascript
复制
 # ENTRYPOINT ["sleep", "5"]

 # sleep 5 python myapp.py
 docker run --rm myimage \
   python myapp.py

 # actually runs "python myapp.py" without the "sleep" wrapper
 docker run --rm \
   --entrypoint python \
   myimage \
   myapp.py \

这个模式意味着几件事:

  • CMD通常应该是一个完整的命令行;您应该期望它在容器启动时被替换。
  • 如果您提供了一个ENTRYPOINT,您应该确保运行作为参数传递的CMD。如果它是一个shell脚本,那么用exec "$@"结束它就可以做到这一点。
  • 如果您不确定应该使用哪一种(而不是同时使用这两种),则更喜欢CMD而不是ENTRYPOINT
  • 如果您的程序具有复杂的调用,请考虑将其封装在shell脚本中,以便可以使用其标准参数集轻松启动它。
代码语言:javascript
复制
FROM python:3.8
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
RUN chmod +x app.py

# No entrypoint; easy to specify an alternate command
CMD ["./app.py"]
代码语言:javascript
复制
# Entrypoint is a wrapper tool that takes a command as options
ENTRYPOINT ["wait-for-it.sh", "db:5432", "--"]
CMD ["./app.py"]
代码语言:javascript
复制
# Entrypoint is a shell script ending in `exec "$@"`
ENTRYPOINT ["./entrypoint.sh"]
CMD ["./app.py"]

(有一个备用的“容器即命令”模式,其中ENTRYPOINT是一个完整的命令,CMD是调用方提供的选项;Docker文档有一个例子。这将不适用于您所描述的PyCharm设置。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60771279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档