Pycharm专业版2019.3
Ubuntu 18.04
我想调试容器中的python脚本。我知道下面的例子过于矫kill过正,但是我想使它尽可能简单。如何将入口点添加到Dockerfile?
docker-compose.yml:
version: '3'
services:
python:
build: .
container_name: ppd
Dockerfile:
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)
如果我运行的项目没有ENTRYPOINT,一切正常:
docker ps -a --no-trunc --format {{.Names}}{{.Command}} | grep ppd
ppd "python3 -u /opt/project/build/app.py"
似乎pycharm提供了CMD命令,因为当我将CMD添加到app.py时,它将被docker忽略。
[当我在app.py中添加ENTRYPOINT并启动容器时,我看到:
docker ps -a --no-trunc --format {{.Names}}{{.Command}} | grep ppd
ppd "sleep 5 python3 -u /opt/project/build/app.py"
如何结合pycharm CMD和Dockerfile中的ENTRYPOINT?
如果您在Dockerfile中将ENTRYPOINT
更改为CMD
,一切都会正常。
ENTRYPOINT
在Dockerfile中不是必需的命令。通常,您至少需要ENTRYPOINT
或CMD
中的一个,但没有具体要求使用其中一个。如果同时指定,则the CMD
gets passed as additional arguments to the ENTRYPOINT
。
例如,在CMD
中,创建容器时覆盖ENTRYPOINT
非常简单:
docker run
这似乎也是PyCharm所做的;它也与Docker Compose中的CMD
选项匹配。
由于命令部分刚刚被附加到入口点部分,因此如所示显示docker run --rm myimage \
python app.py
docker run --rm myimage \
ls -lrt /app
可能会导致某些奇怪的行为,并且需要一些笨拙的解决方法。
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
。如果它是Shell脚本,则以ENTRYPOINT
结尾将完成此操作。CMD
而不是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"]
应该是调用者提供的选项; Docker文档具有ENTRYPOINT
。这不适用于PyCharm您正在描述的设置。)