【问题标题】:Docker-compose won't keep base container runningDocker-compose 不会保持基础容器运行
【发布时间】:2020-07-19 13:25:51
【问题描述】:

我有一个构建 Debian 映像并安装 Apache、Php、MySql 的 Dockerfile。

一般来说,如果我运行 docker 命令:

docker build --tag my-project-image:2.0 .

然后

docker run -dit --name my-project-container \ 
    --mount type=bind,source=$(pwd),destination=/var/www/html \
    -p 80:80 --rm my-project-image:2.0

我的容器保持运行,我开发所需的所有服务都已启动并运行,所以没有问题。

我尝试将此配置移动到 docker-compose 中,但遇到了奇怪的麻烦。我相信我犯了一个非常常见的错误,但我搜索了很多,尝试了很多东西,但无法让它发挥作用。

简而言之,当我运行 docker-compose up 时,我的映像已构建,它会创建一个容器,运行所有脚本并且它立即存在。问题是我想保持该容器运行,因为那里有像 Apache 和 MySQL 这样的服务。

我有两个服务,一个是 lamp 用于 apache、MySQL 和 PHP,另一个是 node 只是为了运行 npm 脚本。

node 容器保持启动并运行,但不幸的是 lamp 立即关闭。

这是我的 Dockerfile

FROM debian:latest
ENV DOC_ROOT=/var/www/html
WORKDIR ${DOC_ROOT}
RUN apt-get update
RUN apt-get --assume-yes upgrade
RUN apt-get --assume-yes install apache2
RUN apt-get --assume-yes install curl php-curl
RUN apt-get --assume-yes install php
RUN apt-get --assume-yes install php-mysql
RUN apt-get --assume-yes install composer
RUN apt-get --assume-yes install php-xdebug
RUN apt-get --assume-yes install default-mysql-server
RUN a2enmod rewrite
COPY ./ ${DOC_ROOT}
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
COPY config/000-default.conf /etc/apache2/sites-available/

EXPOSE 80

这是我的 docker-compose.yaml 文件内容

version: "3.2"
services:
  lamp:
    container_name: lamp-stack
    build: .
    ports:
      - 80:80
    volumes:
    - .:/var/www/html
    command: >
      /bin/sh -c "service apache2 start && \
        service mysql start && \
        mysql < migrations/migrations.sql && \
        mysql < migrations/development.sql && \
        bash"
  node:
    container_name: node-builder
    image: node:12-alpine3.9
    depends_on:
      - lamp
    working_dir: /var/www/html
    volumes:
    - .:/var/www/html
    command: >
      /bin/ash -c "npm run build:dev > ./.logs/npm/npm-build.log && \
        npm run watch:sass > ./.logs/npm/sass-watch.log"


这是我运行docker-compose up时的输出

我最后将bash 包含在最后一个命令中,但它似乎不像我想象的那样在 docker-compose 中工作。只有当我不使用 docker-compose 命令时,它才会让我的容器运行:( .

任何想法我可能做错了什么?

【问题讨论】:

  • 看起来您的lamp 容器的主进程应该是一个交互式外壳,而其他一些进程则作为副作用启动。每个容器只启动一个进程通常是更好的做法,因此在单独的容器中启动 MySQL 和 Apache;如果你需要一个shell进行调试,你可以使用docker exec来获得一个。
  • 是的,我会记住这一点。谢谢

标签: php mysql apache docker docker-compose


【解决方案1】:

尝试在 docker-compose 中添加这些行:

stdin_open: true # equivalent of -i
tty: true        # equivalent of -t

【讨论】:

  • 谢谢。这正是我一直在寻找的。成功了☺
猜你喜欢
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多