【问题标题】:Cannot start a docker container无法启动 docker 容器
【发布时间】:2015-01-06 10:19:59
【问题描述】:

这是我的 Dockerfile,它尝试使用 Phusion Passenger 设置 Nginx,然后安装 Ruby。

# Build command: docker build --force-rm --tag="rails" .
# Run command: docker run -P -d rails
FROM ubuntu:14.04

ENV DEBIAN_FRONTEND noninteractive

# Install nginx and passenger
RUN sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
RUN sudo sudo apt-get install -yf apt-transport-https ca-certificates
RUN sudo echo 'deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main' > /etc/apt/sources.list.d/passenger.list
RUN sudo chown root: /etc/apt/sources.list.d/passenger.list
RUN sudo chmod 600 /etc/apt/sources.list.d/passenger.list
RUN sudo apt-get update
RUN sudo apt-get install -yf nginx-extras passenger
RUN sudo service nginx restart

# Install rbenv and ruby
RUN sudo apt-get install -yf git autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev curl
RUN git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
RUN echo 'eval "$(rbenv init -)"' >> ~/.bashrc
RUN /root/.rbenv/plugins/ruby-build/install.sh
ENV PATH /root/.rbenv/bin:$PATH
RUN rbenv install 2.1.5
RUN rbenv global 2.1.5

EXPOSE 80

基本上,我可以很好地构建映像,但我无法从该映像启动容器。

这是我第一次使用docker,所以我怀疑我需要使用CMD指令,但我不知道应该在那里执行什么命令。

感谢任何帮助指出我的 Dockerfile 出了什么问题。

【问题讨论】:

  • 我无法从此图像启动容器是什么意思?您收到错误消息吗?如果有,是哪一个?你如何尝试启动容器? …?
  • 我没有收到任何错误消息。我通过 docker run -P -d image_id 启动容器。容器刚启动后的状态是Exited (0)。
  • 是的,您没有收到错误消息,因为一切正常 :) 我已经添加了答案。

标签: docker dockerfile


【解决方案1】:

容器正在成功运行,它只是立即退出,因为您没有指定要运行的任何进程。一个容器只会运行它的主进程。当您在后台运行它(-d 标志)时,它不会提供任何输出,这有点令人困惑。

例如:

$ docker run ubuntu echo "Hello World"
Hello World

容器运行命令并按预期退出。

$ docker run -d ubuntu echo "Hello World"
efd8f9980c1c9489f72a576575cf57ec3c2961e312b981ad13a2118914732036

发生了同样的事情,但是当我们使用-d 运行时,我们得到了容器的 id 而不是输出。我们可以使用logs 命令获取输出:

$ docker logs efd8f9980c1c9489f72a576575cf57ec3c2961e312b981ad13a2118914732036
Hello World

您需要做的是启动您的 rails 应用程序,或启动容器时您希望容器运行的任何进程。您可以通过 docker run 命令或使用 Dockerfile 中的 CMD 语句来执行此操作。请注意,主进程必须留在前台 - 如果它分叉到后台,容器将退出。

如果您想在容器中获取 shell,请以 -it 开头,例如:

$ docker run -it ubuntu /bin/bash

说实话,我认为使用官方图片会更好地为您服务,例如https://registry.hub.docker.com/_/rails/.

【讨论】:

  • 感谢您的回答,我想我正在取得进展。事实上,我必须运行一些东西,否则 docker 进程将退出。我发现命令nginx可以启动nginx,从官方的Nginx dockerfile中可以看到。但是,即使我运行该命令,容器也会立即退出。如何让 nginx 保持运行?
  • 在执行此操作之前,我还尝试了乘客 docker,但他们没有最新的 Ruby。我可以从他们的镜像开始升级 Ruby,但我也想学习如何从头开始构建自己的镜像。
  • 需要在前台启动nginx。查看nginx dockerfile,需要nginx -g daemon off
  • 谢谢阿德里安,这行得通!要更正您的命令,它应该是nginx -g "daemon off;"。也许您应该为其他查看者更新您的答案,即要运行的进程必须在前台。另外,我可以将它包含在 Dockerfile RUN echo "daemon off;" >> /etc/nginx/nginx.conf.
  • 实际上,我已经在答案中提到了这一点 :) 你也可以直接把它放在 Dockerfile 中:CMD ["nginx", "-g", "daemon off;"] 无论如何,我很高兴你能正常工作。
【解决方案2】:

你需要使用ENTRYPOINT来启动你想要的,检查official documentation

【讨论】:

  • 嗯,我认为Ubuntu镜像默认运行/bin/bash。
  • 我不这么认为,因为在使用 Dockerfile 时,您只是在构建映像。但是你可以通过 ssh 访问它。
  • 我是说这个 Dockerfile 继承自 Ubuntu 映像,该映像具有启动 /bin/bash 的 CMD 行。如果您不覆盖它,它将在您启动容器时运行。
  • Ubuntu 映像确实默认运行 /bin/bash。这是容器的状态,显示它运行 /bin/bash: 40e9817b2a21 khang/rails:latest "/bin/bash" 11 秒前 Exited (0) 10 秒前 jolly_archimedes
【解决方案3】:

通过发出来查看日志的内容

docker logs rails

或者,作为

docker ps -an 1

应该显示最后一个id,用命令

docker logs this_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2014-09-24
    • 2020-01-28
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多