无法弄清楚如何正确使用cmd在docker中执行脚本

时间:2019-01-03 16:41:10

标签: docker cmd dockerfile

我试图弄清楚如何在dockerfile中获取CMD命令以在启动docker run时运行脚本,我知道使用RUN命令将在构建映像时使用映像来预运行该脚本,但是我希望我每次使用该图像运行新容器时都运行脚本。该脚本只是将当前日期/时间输出到文件的简单脚本。

这是如果我使用RUN可以使用的dockerfile

# Pull base image
FROM alpine:latest
# gcr.io/dev-ihm-analytics-platform/practice_docker:ulta
WORKDIR /root/
RUN apk --update upgrade && apk add bash
ADD ./script.sh ./
RUN ./script.sh

这是与CMD不兼容的相同dockerfile

# Pull base image
FROM alpine:latest
# gcr.io/dev-ihm-analytics-platform/practice_docker:ulta
WORKDIR /root/
RUN apk --update upgrade && apk add bash
ADD ./script.sh ./
CMD ["./script.sh"]

我在CMD命令之后尝试了各种方法,例如[“ /script.sh"]、["bash script.sh”],[“ bash”,“ ./ script.sh”],bash脚本。 sh,但我总是会出错,而且我不知道自己在做什么错。我只想要

docker run -it name_of_container bash

然后发现该脚本已执行,因为一旦我进入容器,便看到容器中有一个包含运行信息的输出文件

3 个答案:

答案 0 :(得分:1)

有三种基本方法可以做到这一点:

  1. 您可以RUN ./script.sh。它会在docker build时间发生一次,并被烘焙到您的图像中。

  2. 您可以CMD ./script.sh。它只会发生一次,并且是容器运行的单个命令。如果您提供了一些替代命令(例如docker run ... bash)来运行而不是此CMD。

  3. 您可以编写一个自定义入口点脚本来执行此首次设置,然后运行CMD或在命令行中传递的任何内容。主容器进程是入口点,它被作为参数传递给命令。该脚本(及其内部执行的所有操作)将在每次启动时运行。这个脚本看起来像

    #!/bin/sh
    ./script.sh
    exec "$@"
    

    需要将其单独复制到图片中,然后设置类似ENTRYPOINT ["./entrypoint.sh"]的内容。

(鉴于您实际描述的问题-您有一个shell脚本,并且想要运行它并检查交互式shell中的文件输出-我只是在您本地的命令提示符下运行它,而不涉及完全没有Docker。这避免了所有这些排序和文件系统映射问题。

答案 1 :(得分:0)

有多种方法可以实现所需的目标,但是用RUN ./script.sh行进行的第一次尝试可能是最好的。

CMD和ENTRYPOINT命令在命令行上可以作为container run命令的标志来覆盖。因此,如果您想确保每次启动容器时都可以运行该容器,那么它就不应成为CMD或ENTRYPOINT命令的一部分。

答案 2 :(得分:-1)

好吧,我用CMD命令启动我的Java应用程序,并且当容器在WORKDIR内时,我会执行以下操作:

CMD ["/usr/bin/java", "-jar", "-Dspring.profiles.active=default", "/app.jar"]

您是否尝试删除了“。”在CMD命令中看起来像这样:

CMD ["/script.sh"]

使用RUN或CMD时可能会有不同的语法。