【问题标题】:Docker-compose up does not start a containerdocker-compose up 不启动容器
【发布时间】:2019-08-29 11:20:09
【问题描述】:

Dockerfile:

FROM shawnzhu/ruby-nodejs:0.12.7

RUN \
    apt-get install git \   
    && npm install -g bower gulp grunt \
    gem install sass

RUN useradd -ms /bin/bash devel

# Deal with ssh
COPY ssh_keys/id_rsa /devel/.ssh/id_rsa
COPY ssh_keys/id_rsa.pub /devel/.ssh/id_rsa.pub
RUN echo "IdentityFile /devel/.ssh/id_rsa" > /devel/.ssh/config

# set root password
RUN echo 'root:password' | chpasswd

# Add gitconfig
COPY .gitconfig /devel/.gitconfig

USER devel

WORKDIR /var/www/

EXPOSE 80

docker-compose.yml 文件:

nodejs:
  build: .
  ports:
    - "8001:80"
    - "3000:3000"
  volumes:
    - ~/Web/docker/nodejs/www:/var/www

命令:

$ docker-compose build nodejs

$ docker 图片

REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nodejs_nodejs          latest              aece5fb27134        2 minutes ago       596.5 MB
shawnzhu/ruby-nodejs   0.12.7              bbd5b568b88f        5 months ago        547.5 MB

$ docker-compose up -d nodejs

Creating nodejs_nodejs_1

$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker ps --all

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
c24c6d0e756b        nodejs_nodejs       "/bin/bash"         About a minute ago   Exited (0) About a minute ago                       nodejs_nodejs_1

正如您所见,docker-compose up -d 应该已经创建了一个容器并在后台运行它,但它没有。相反,它以代码 0 退出。

【问题讨论】:

  • 你的 Dockerfile 没有启动任务
  • 我应该在 Dockerfile 中添加什么?
  • 例如你可以添加节点 start_server.js ?你明白为什么吗?
  • 不,我只是想稍后在里面运行一个容器来 ssh,而不是做额外的事情
  • 好的,运行 bash 实例 :) Docker 停止容器,如果它什么都不做。

标签: docker docker-compose


【解决方案1】:

如果你的 Dockerfile 没有做任何事情(例如,一个监听端口 80 的网络服务器),它会在运行完指令后立即被丢弃。因为Docker containers should be "ephemeral"

如果你只想启动一个容器并通过终端与之交互,不要使用docker-compose up -d,而是使用以下内容:

docker run -it --entrypoint=/bin/bash [your_image_id]

这将启动你的容器并运行/bin/bash-it 帮助你保持终端会话与容器交互。完成工作后,按Ctrl-D 退出。

【讨论】:

  • 解决方案是可以的,但是如果要调试编排,这不是很方便的解决方案。我遇到了以下技巧:添加entrypoint: tail /var/log/syslog(例如;基本上,图像中存在的任何文件)-这不会让容器立即退出。 PS:当然,如果您在容器中运行任何守护程序,则不需要
【解决方案2】:

SQL Server 2017 容器在创建后很快退出,我遇到了类似的问题。容器内运行的进程要长时间运行,否则 Docker 会退出容器。在 docker-compose 场景中,我实现了 tty:true 方法,此处记录了 https://www.handsonarchitect.com/2018/01/docker-compose-tip-how-to-avoid-sql.html

【讨论】:

  • 谢谢!这是我在尝试同时使用 Jenkins 和 Unity 时遇到的问题,一旦创建了 unityci 容器,它就退出了,然后 Jenkins 一个保持运行,但另一个需要手动启动。
最近更新 更多