首页 > 解决方案 > 如何检测容器中的交互式标志?

问题描述

首先,这个问题不是这里问题的重复。我目前正在学习 docker,并且需要创建一个在容器开始时使用以下命令dockerfile安装和运行它的工具:tomcatentrypoint

以下是我的内容dockerfile

FROM ubuntu:latest

LABEL MAINTAINER="kesarling"

RUN apt update
RUN apt upgrade -y
RUN apt install apt-utils -y
RUN apt install maven gradle -y
RUN apt install wget tar zip unzip openjdk-14-jdk -y

RUN mkdir /usr/local/apache-tomcat-v8.5.55
RUN wget http://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz -O /tmp/apache-tomcat-v8.5.55.tar.gz
RUN cd /tmp && tar xvfz apache-tomcat-v8.5.55.tar.gz
RUN cp -Rv /tmp/apache-tomcat-8.5.55/* /usr/local/apache-tomcat-v8.5.55/

RUN mkdir /usr/local/spring-v5.2.6
RUN wget https://repo.spring.io/release/org/springframework/spring/5.2.6.RELEASE/spring-5.2.6.RELEASE-dist.zip -O /tmp/spring-v5.2.6.zip
RUN cd /tmp && unzip spring-v5.2.6.zip
RUN cp -Rv /tmp/spring-framework-5.2.6.RELEASE/* /usr/local/spring-v5.2.6/



RUN cd ~
RUN touch server-start.sh
RUN echo "#!/bin/sh" | cat > server-start.sh
# start of condition
RUN echo 'bash -c "/usr/local/apache-tomcat-v8.5.55/bin/catalina.sh run&"' | cat >> server-start.sh
RUN echo "/bin/bash" | cat >>server-start.sh
# end of condition
RUN chmod +x server-start.sh

EXPOSE 8080

ENTRYPOINT [ "./server-start.sh" ]

由于服务器作为后台进程启动,因此只有在我给出-it标志时它才能正常运行。否则,正如预期的那样,容器在我分离它的那一刻就退出了。


所以,简而言之:

docker container run -it -p 8080:8080 <mydockername>

有效但:

docker container run -dp 8080:8080 <mydockername>

没有(如预期的那样)。这就是条件出现的地方。简而言之,我需要它来检测 docker 是在后台运行还是在交互模式下运行。


condition需要中提到的blockdockerfile如下:

如果我用-it标志执行它:

RUN echo 'bash -c "/usr/local/apache-tomcat-v8.5.55/bin/catalina.sh run&"' | cat >> server-start.sh
RUN echo "/bin/bash" | cat >>server-start.sh

否则,如果我使用 -d 标志执行:

RUN echo 'bash -c "/usr/local/apache-tomcat-v8.5.55/bin/catalina.sh run"' | cat >> server-start.sh

(请注意/bin/bash已删除)


我该怎么做?

PS 这是我进入 docker 的第一周,所以请耐心等待我的 dockerfile :P

哦,更不用说搜索detect if the container has been run with an interactive flag并没有带来任何有用的东西Google

标签: dockerdockerfile

解决方案


你根本不需要start.sh

只需使用 CMD 指令,如下所示。

CMD ["/usr/local/apache-tomcat-v8.5.55/bin/catalina.sh", "run"]

以下两个命令都会启动tomcat

docker run -it -p 8080:8080 <imagename> 

docker run -p 8080:8080 <imagename>

如果您想调试容器内的某些内容并想要访问容器外壳,您可以启动一个容器并运行 bash,如下所示

docker run -it <imagename> bash 

这将使用bash.


您也可以在上面的建议中替换CMDENTRYPOINT,但是如果您想访问容器外壳,您必须执行以下操作 -

docker run --entrypoint bash -it <imagename>

您还可以在此处查看官方 tomcat 映像及其 dockerfile - https://hub.docker.com/_/tomcat


推荐阅读