Docker容器以三种不同的方式运行CMD命令,为什么?

时间:2019-08-05 09:24:20

标签: python bash docker dockerfile docker-build

我已经设置了Dockerfile,如下所示:

FROM python:3.6
ARG label
ARG seeds
ARG dataset_name=${label}_terms

RUN mkdir /prodigy
WORKDIR /prodigy
COPY ./prodigy-1.8.1-cp35.cp36.cp37-cp35m.cp36m.cp37m-linux_x86_64.whl /prodigy

RUN pip install prodigy-1.8.1-cp35.cp36.cp37-cp35m.cp36m.cp37m-linux_x86_64.whl
RUN pip install -U spacy
RUN python -m spacy download en_core_web_lg

EXPOSE 8080

RUN mkdir /work
ENV PRODIGY_HOME /work
WORKDIR /work
COPY ./prodigy.json /work

RUN prodigy dataset ${dataset_name}

ENV LABEL=${label}
ENV SEEDS=${seeds}

CMD prodigy terms.teach ${LABEL}_terms en_core_web_lg --seed "$SEEDS"

它有效,但未达到预期效果。它应该只运行一次CMD命令。而是通过3种不同的方式(ps aux输出)来做到这一点:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4280   692 ?        Ss   08:47   0:00 /bin/sh -c prodigy terms.teach ${LABEL}_terms en_core_web_lg --seed "$SEEDS"
root         8  0.0  0.0   4280   740 ?        S    08:47   0:00 /bin/sh /usr/local/bin/prodigy terms.teach TRANSFER_terms en_core_web_lg --seed transfer, relocation, relegation
root         9 46.1 13.7 2329976 1687016 ?     Sl   08:47  15:13 python -m prodigy terms.teach TRANSFER_terms en_core_web_lg --seed transfer, relocation, relegation

我想知道这是什么标准行为?如何使Dockerfile干净?

1 个答案:

答案 0 :(得分:0)

(没有查看正在运行的命令的详细信息),我怀疑prodigy命令本身会产生一个新的shell /子命令。

在进程列表中,PID 1是Docker作为容器的主进程运行的进程;其他进程是第一个进程的子进程,由主进程启动。