如何在 Docker 中正确创建映像

时间:2021-01-07 18:18:15

标签: docker dockerfile

我对 Docker 相当陌生。我正在从基本图像创建一个新图像。我正在使用以下 Dockerfile。我打开了基础镜像 Dockerfile 并复制了 CMD。进行了修改,并在尝试运行新创建的映像时进行了修改。容器启动,但执行的命令显示为 "kamailio -DD -E /bin/sh -c '["kamailio" "-DD" "-E"]'"。我怎样才能让输入命令只是“kamailio -DD -E”?我已将 Entrypoint 更改为 CMD,但没有运气。我错过了什么?如果它与基本图像相同,我是否还需要 CMD 命令?

FROM kamailio/kamailio:5.2.8-stretch
WORKDIR ./
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5060
ENTRYPOINT ["kamailio -DD -E"]

1 个答案:

答案 0 :(得分:0)

您的 ENTRYPOINT 语法错误。语法应该是:

ENTRYPOINT ["kamilio", "-DD", "-E"]

这样,Docker 将在没有 shell 帮助的情况下执行此命令。

CMDENTRYPOINT 使用字符串语法时,它们会被包裹在 sh -c 中,因此您必须使用 JSON 语法来避免它。 JSON 语法采用 ["your_program", "param1", "param2", "...", "param n"] 的形式。我想如果你像你那样做你的入口点,Docker 会将它解析为字符串语法,因此它会被 sh-c 包裹。

此外,当您在 Dockerfile 中一起使用 ENTRYPOINTCMD 时,它们应始终采用 JSON 格式。

编辑:您可以在此处阅读有关此主题的更多信息 https://container.training/intro-selfpaced.yml.html#191

EDIT2:我总是通过以下方式通过 docker-compose 构建我的图像:

someContainer:
    build:
      context: ./folderContainingDockerFile
      dockerfile: ./Dockerfile
    ports:
      - "outside:5060"
# also try adding your entrypoint through docker-compose file like that:
    entrypoint: ["kamilio", "-DD", "-E"]