我试图弄清楚如何在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
然后发现该脚本已执行,因为一旦我进入容器,便看到容器中有一个包含运行信息的输出文件
答案 0 :(得分:1)
有三种基本方法可以做到这一点:
您可以RUN ./script.sh
。它会在docker build
时间发生一次,并被烘焙到您的图像中。
您可以CMD ./script.sh
。它只会发生一次,并且是容器运行的单个命令。如果您提供了一些替代命令(例如docker run ... bash
)来运行而不是此CMD。
您可以编写一个自定义入口点脚本来执行此首次设置,然后运行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时可能会有不同的语法。