docker - 如何检测容器中的交互式标志?
问题描述
首先,这个问题不是这里问题的重复。我目前正在学习 docker,并且需要创建一个在容器开始时使用以下命令dockerfile
安装和运行它的工具:tomcat
entrypoint
以下是我的内容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
解决方案
你根本不需要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
.
您也可以在上面的建议中替换CMD
为ENTRYPOINT
,但是如果您想访问容器外壳,您必须执行以下操作 -
docker run --entrypoint bash -it <imagename>
您还可以在此处查看官方 tomcat 映像及其 dockerfile - https://hub.docker.com/_/tomcat
推荐阅读
- kotlin - 在 Kotlin 中使用 FastUtil IntList 时避免弃用警告
- visual-studio-code - 有没有办法修改 VSCode 证书存储以添加证书?
- python - 将列表更改为 txt 文件中的列和行
- android - 哪些依赖项包含包含 ELF 文件的 ZIP 文件?
- reactjs - 如何使用 GSAP 为两个 SVG 路径之间的过渡设置动画
- angular - Angular 7 测试失败,无法理解原因。有人帮我吗?
- css - 让 CSS 类以 % 的形式填充剩余的宽度。(哈巴狗/翡翠)
- r - 变异和 case_when 给出了 NA
- mysql - Gitlab CI黄昏 - MySQL连接被拒绝
- prolog - 参数没有充分实例化序言