【问题标题】:Dockerfile entrypoint binary set to an env variableDockerfile 入口点二进制设置为环境变量
【发布时间】:2020-03-24 07:17:12
【问题描述】:

我有一个构建器脚本来创建 Docker 映像。在那个构建器脚本中,我将二进制名称作为 build-args 传递。

但是,当我在入口点将它用作:Entrypoint["./"${pkg}] 时,它确实解析了pkg Docker 容器无法运行并显示“./rtspappserver not found”。

这里的rtspappserverpkg 名称。我从脚本发送的构建参数在 Dockerfile 中设置为 ENV vars。

以下是 Dockerfile 供参考:

#Download base image ubuntu 18.04
FROM ubuntu:18.04
ARG package_name
ENV TZ=Etc/UTC
ENV pkg=$package_name
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# Update and dist-upgrade ubuntu
RUN apt update -y && \
    apt dist-upgrade -y && \
    apt install -y python-heatclient
WORKDIR /
COPY ${pkg} /
ENTRYPOINT ["./rtspappserver"]

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    这是一个我不倾向于作为构建参数传递的选项。我的一般经验是,如果您确实有一个生成多个二进制文件或命令的环境,则映像的最大部分(根据映像大小和 Dockerfile 复杂性)是所有命令共享的代码,因此构建一个单独的映像每个命令都可能是矫枉过正。

    您可以指定备用命令作为docker run 命令的一部分在映像名称之后运行,或者在docker-compose.yml 文件的command: 行中运行。然后你可以将所有内容复制到图像中,指定一些默认命令

    FROM ubuntu:18.04
    ...
    WORKDIR /app  # try to avoid dropping things in /
    ENV PATH /app:$PATH
    COPY . .
    CMD mainserver
    

    现在,如果您只是 docker run the_image,它将运行 mainserver,但您可以

    docker run ... the_image rtspappserver
    

    运行备用命令。

    【讨论】:

      【解决方案2】:

      不确定我是否正确理解了这个问题,但这可能会有所帮助:您可以以“shell”或“exec”形式指定 ENTRYPOINT。您目前使用后者,它不会插入环境变量。

      来自docs

      您可以为 ENTRYPOINT 指定一个纯字符串,它将在 /bin/sh -c 中执行。此表单将使用 shell 处理来替换 shell 环境变量 [...]

      【讨论】:

      • 请注意,如果您确实对ENTRYPOINT 使用纯字符串,它将有效地阻止您访问CMD
      猜你喜欢
      • 2020-06-27
      • 2018-10-22
      • 1970-01-01
      • 2019-09-11
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多