# For more information, please refer to https://aka.ms/vscode-docker-python
FROM python:3.8-slim-buster
# Keeps Python from generating .pyc files in the container
ENV PYTHONDONTWRITEBYTECODE=1
# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1
# Install pip requirements
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
WORKDIR /app
COPY . /app
# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-python-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
#CMD ["python", "src/train.py"]
出于多种原因,docker 容器非常有用,但我并不总是需要CMD
在 dockerfile 中。现在,如果我注释掉CMD ["python", "src/train.py"]
并构建/运行,容器永远不会出现。如果我仅CMD ["python", "src/train.py"]
在 dockerfile 中构建/运行,容器将存在一小会儿,因为python src/train.py
会产生错误。我如何提供虚拟的CMD
或ENTRYPOINT
?请注意https://stackoverflow.com/questions/21553353/dockerfile 中 cmd 和entrypoint 之间有什么区别?解释道Dockerfile should specify at least one of CMD or ENTRYPOINT commands
。
更新
我改变CMD ["python", "src/train.py"]
了ENTRYPOINT ["tail", "-f", "/dev/null"]
并且它起作用了,但我不确定这是否是一个好的解决方案(来源:https://stackoverflow.com/questions/25775266/how-to-keep-docker-container-running-after-starting-services)。
答案1
对于开发、调试和实用目的而言,Tailing/dev/null
是有效的(按原样)。["sleep", "inifity"]
Docker 是为了本质上包装了一个正在运行的进程。通过在 CMD 之外的容器中执行操作(如果您正在使用 tailing dev null),您将无法通过访问日志docker logs
,也无法使用 docker 生态系统通过容器状态中反映的退出代码来验证进程的状态。
如果你没有在 docker 中运行任何进程,那么我不确定容器与使用 WSL 相比有什么好处。尽管如果镜像提供了一般用途bash
,将默认入口点设置为以便您可以进入 shell仍然是有礼貌的,确保您-it
在运行时传入。
您需要指定容器的用途,因为这将有助于确定您当前的设置是否是一个好的解决方案(对于我们目前不知道的问题),以及什么可能是最好的