Professional 2019.3
Ubuntu 18.04
我想在容器中调试python脚本。我知道下面的例子是过分的,但我想使它尽可能简单。如何将入口点添加到Dockerfile中?
docker-compose.yml:
version: '3'
services:
python:
build: .
container_name: ppd文档:
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
python3-pip
ENTRYPOINT ["sleep", "5"]app.py:
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结合起来?
发布于 2020-03-20 09:57:26
如果在您的Dockerfile中将ENTRYPOINT更改为CMD,则一切都将正常工作。
ENTRYPOINT不是Dockerfile中的必需命令。您通常需要至少一个ENTRYPOINT或CMD,但没有使用其中一个或另一个的具体要求。如果两者都指定,ENTRYPOINT。
例如,在docker run中,在创建容器时很容易重写CMD:
docker run --rm myimage \
python app.py
docker run --rm myimage \
ls -lrt /app这似乎也是PyCharm正在做的事情;它还匹配Docker中的command:选项。
由于命令部分只是附加到入口点部分,所以如您所示,指定ENTRYPOINT可能会导致一些奇怪的行为,您需要一些尴尬的解决方案。
# 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。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"]# Entrypoint is a wrapper tool that takes a command as options
ENTRYPOINT ["wait-for-it.sh", "db:5432", "--"]
CMD ["./app.py"]# Entrypoint is a shell script ending in `exec "$@"`
ENTRYPOINT ["./entrypoint.sh"]
CMD ["./app.py"](有一个备用的“容器即命令”模式,其中ENTRYPOINT是一个完整的命令,CMD是调用方提供的选项;Docker文档有一个例子。这将不适用于您所描述的PyCharm设置。)
https://stackoverflow.com/questions/60771279
复制相似问题