我刚接触到docker,尝试在AWS免费层帐户t2上构建我的第一个码头容器。
我能够基于下面的Dockerfile构建我的码头。
FROM java:8
COPY content-service /
RUN chmod +x /bin/start.sh
CMD bash -C '/bin/start.sh'
EXPOSE 8081
MAINTAINER Velu
它失败了,并在试图运行容器命令时退出,在收到错误消息之后。
[ec2-user@ip-172-31-30-38 cis-docker]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
content-service latest 9fa3ca5a8ac3 10 minutes ago 705.7 MB
docker.io/java 8 d23bdf5b1b1b 8 months ago 643.1 MB
[ec2-user@ip-172-31-30-38 cis-docker]$ sudo docker --debug run -p 8082:8082 content-service
DEBU[0000] framesize: 18
Starting service.
DEBU[0000] Corrupted prefix: []
DEBU[0000] [hijack] End of stdout
任何帮助都将不胜感激。
发布于 2018-01-16 01:10:35
我发现并解决了这个问题。
在我的start.sh脚本的最后一行中,我有下面一行。
java -cp $CLASS_PATH $JVM_OPTIONS $CLASS_NAME ${ARGUMENTS[@]} & echo $! > $PID_FILE
在这一行中,我确实删除了这个& echo $!> $PID_FILE,
工作:
java -cp $CLASS_PATH $JVM_OPTIONS $CLASS_NAME ${ARGUMENTS[@]}
发布于 2017-09-16 13:29:47
我通过复制一个简单的shell脚本来运行您的docker文件,该脚本在控制台上打印"hello“。它成功地运行了。
而且,似乎您的码头集装箱并不退出。Docker正在运行您的shell脚本并优雅地退出。若要验证,请在码头运行完成后立即运行以下命令,检查停靠程序运行命令的退出代码。
echo $?
如果上面的命令将"0“打印到屏幕上,那么停靠器就不会失败。
如果希望shell脚本作为后台守护进程运行,则需要确保脚本不退出。docker容器在CMD行中指定的shell脚本一执行完就会退出的原因是,Docker的设计理念是运行one process per container。在您的例子中,单个进程是您的shell脚本。因此,将在shell脚本中启动的任何服务作为前台进程启动,只要该服务正在运行,容器就会继续运行。一旦该服务结束,您的容器就会死掉,这可能是您想要的。
希望这能有所帮助。
https://stackoverflow.com/questions/46247154
复制