我是码头工的新手,
我已经预先制作了一个docker镜像(更新并安装了Java和其他依赖项)并将其存储在我的GitHub仓库中,
我在AWS S3存储桶上存储了一个简单的hello world Spring Boot应用程序,
我想要我的DockerFile -
1.从我的GitHub回购中获取docker图像
2.做一个更新补丁
3.将我的工作目录设置为/ home / ubuntu
4.使用wget从S3存储桶下载应用程序(可公开访问)
5.在容器内运行应用程序
之后我将运行图像。
构建命令 -
docker build -t someTag .
要运行的命令 -
docker run -p 9090:8090 someTag
我将下载的java应用程序jar是 - docker.jar
应用程序在端口8080上运行
我有以下Dockerfile -
FROM someRepoHere
WORKDIR /home/ubuntu
RUN apt-get update
RUN cd /home/ubuntu
VOLUME /home/ubuntu
RUN wget S3BucketLocationHere
#RUN nohup java -jar docker.jar &
# Expose the default port
EXPOSE 8080
#Old command - CMD nohup java -jar docker.jar &
CMD ["java", "-jar", "docker.jar"]
DockerFile能够成功构建图像但是,
我的应用程序无法访问,它没有在容器内运行
在本地,如果我找到我的应用程序并运行nohup命令,则应用程序会成功响应。
答案 0 :(得分:2)
正在运行的命令控制容器的存在,当它退出/返回时,容器退出和停止。因此,您需要在前台运行命令。当您在容器中的交互式shell中时,该命令是您的shell。您列出的命令使用了一个shell,但是当它用完要处理的命令并且没有任何东西在前台运行时,该shell退出:
CMD nohup java -jar docker.jar &
字符串语法将使用/bin/sh -c "nohup java ..."
运行命令。
更好的选择是使用json语法运行,如果你不需要shell,并在前台运行你的java应用程序,避免nohup和后台语法:
CMD ["java", "-jar", "docker.jar"]
关于提供的Dockerfile的更多评论:
WORKDIR /home/ubuntu
RUN apt-get update
这只会在您的容器内创建一个缓存,如果您将来尝试使用它,它将变得陈旧并导致缓存未命中。如果这是您的意图,这不会升级任何包。该行应删除。
RUN cd /home/ubuntu
这不会对文件系统进行任何更改,也不会对生成的图像产生任何影响。退出RUN
行后,当前shell状态将丢失,包括当前目录和您设置的任何变量。该行应删除。
VOLUME /home/ubuntu
从这一行开始,对/ home / ubuntu的更改将会丢失。除非您在运行时在同一位置指定卷,否则您将只看到作为结果创建的匿名卷。你可能不想要上面的音量线,因为它会破坏下一行的内容。
RUN wget S3BucketLocationHere
这一行已被混淆但我怀疑你输出的是/ home / ubuntu,因为WORKDIR
的值。由于上面的VOLUME
行,此处创建的任何内容都将丢失。