【问题标题】:How can i play my script on Dockerfile and pass argument to the script我如何在 Dockerfile 上播放我的脚本并将参数传递给脚本
【发布时间】:2020-12-05 18:52:02
【问题描述】:

我有这个 Dockerfile ,我想将参数传递给脚本并在容器上运行它,但由于某种原因它不会工作。 我使用 ARG & ENV 和 ENTRYPOINT。

FROM jrei/systemd-ubuntu:18.04
MAINTAINER devops@carbyne911.com
RUN apt-get update -y && \
  apt-get upgrade -y  && \
  apt-get install -y --no-install-recommends \
  vim \
  apt-utils \
  net-tools \
  openjdk-8-jre \
  linux-headers-generic \
  libgstreamer1.0-0 \
  gstreamer1.0-plugins-base \
  gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-ugly \
  gstreamer1.0-libav \
  gstreamer1.0-doc \
  gstreamer1.0-tools \
  gstreamer1.0-rtsp \
  python-gst-1.0 \
  python3-gst-1.0 \
  libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev \
  libfontconfig1-dev \
  libfreetype6-dev \
  libpng-dev \
  libcairo2-dev \
  libjpeg-dev \
  libgif-dev \
  libgstreamer-plugins-base1.0-dev 
ARG JAR_VERSION
ENV mfsVersion=$JAR_VERSION
RUN mkdir -p /home/ubuntu
COPY ./target/deployment/dependencies.tar.gz /home/ubuntu
COPY ./target/deployment/aws_install-docker.sh /home/ubuntu
COPY ./target/deployment/MediaForwardService-${JAR_VERSION}-standalone.jar /home/ubuntu
COPY ./target/deployment/MediaForwardService-${JAR_VERSION}-standalone.jar /home/ubuntu
COPY ./target/deployment/libMediaForwardRSL-${JAR_VERSION}.so /lib64/
COPY ./src/main/resources/application.conf /home/ubuntu
COPY ./target/deployment/systemctl3.py /usr/bin/systemctl
RUN test -L /bin/systemctl || ln -sf /usr/bin/systemctl /bin/systemctl
RUN chmod +x /usr/bin/systemctl
WORKDIR /home/ubuntu
RUN chmod +x aws_install-docker.sh
EXPOSE 8102
EXPOSE 16384 
EXPOSE 32766
ENTRYPOINT ["/bin/bash","-c", "/home/ubuntu/aws_install-docker.sh"]
CMD ["$mfsVersion"]

似乎我对我传递的论点有误。我做错了什么?

【问题讨论】:

  • 您可能不想要ENTRYPOINT,而只想要CMD ./aws_install-docker.sh $mfsVersion,猜测一下,但如果没有实际的错误消息,这有点难以说。
  • 您使用的是 Windows 还是 Linux? [cmd] 标签建议使用 Windows 的命令解释器,但您的代码建议您在 Ubuntu 中执行此操作并使用 Bourne Again SHell。由于这似乎不适用于 Windows 命令解释器cmd.exe,并且您有足够的时间做出回应,因此我决定删除您的无效标签。

标签: linux docker environment-variables dockerfile


【解决方案1】:

在您的设置中,您在 CMD 中的参数作为参数传递给 /bin/bash 而不是您的脚本,因此它会实际运行:

/bin/bash -c /home/ubuntu/aws_install-docker.sh $mfsVersion

而不是

/bin/bash -c "/home/ubuntu/aws_install-docker.sh $mfsVersion"

您需要做的是删除CMD 并在ENTRYPOINT 中提供参数。

所以你可以使用:

ENTRYPOINT /bin/bash -c "/home/ubuntu/aws_install-docker.sh $mfsVersion"

但是,除非您有特殊原因使用/bin/bash -c,否则我会这样做:

ENTRYPOINT /home/ubuntu/aws_install-docker.sh $mfsVersion

这是一个更简单的 Dockerfile 用于实验:

FROM alpine
ARG JAR_VERSION="1.0"
ENV mfsVersion=$JAR_VERSION
ENTRYPOINT echo $mfsVersion

可以通过以下方式构建和运行:

$ docker build -t temp --build-arg JAR_VERSION=2.0 .
$ docker run --rm -it temp
2.0

最后,根据您的需要,您可能希望使用ENTRYPOINTCMD 来完成该任务(但不能同时使用两者)。这是一个使用入口点脚本(而不是普通的echo)和在CMD 中而不是ENTRYPOINT 中的示例:

FROM alpine
ARG JAR_VERSION="1.0"
ENV mfsVersion=$JAR_VERSION
COPY ./entrypoint /entrypoint
RUN chmod +x /entrypoint
CMD /entrypoint $mfsVersion

还有entrypoint 示例脚本:

#!/usr/bin/env sh
echo "Params: $*"

为此使用CMD 的好处是,您仍然可以在需要时使用docker run image-name bash 进入容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多