Docker容器重启时如何运行命令

时间:2020-06-06 13:17:38

标签: apache docker docker-compose dockerfile restart

我是使用Docker和docker-compose的新手,如果我对某些术语有误,请您道歉。

已经为我提供了Dockerfiledocker-compose.yml,并且已经成功构建了图像并启动并运行了容器(通过运行docker-compose up -d),但是我想进行更新为了使我的过程更容易一些,有时我需要通过使用以下命令访问它来在容器(WordPress)上重新启动Apache:

docker exec -it 89a145b5ea3e /bin/bash

然后输入:

service apache2 restart

我的第一个问题是,要使项目正常运行,还需要运行另外两项服务,而当我运行上述service apache2 restart命令时,这些服务不会自动重新启动。

我需要运行的两个命令是:

service memcached start
service cron start

我想知道如何在重新启动apache2时始终运行这些命令。

第二,我想配置我的Dockerfiledocker-compose.yml(不确定我应该在哪里添加它),以便在将其添加到容器/图像中时将其表现出来。内置。

我已经设法通过将服务添加到我的Dockerfile中来安装服务,但无法弄清楚如何在重新启动容器时使这些服务运行。

以下是相关文件的内容:

Dockerfile:

FROM wordpress:5.1-php7.3-apache

RUN yes | apt-get update -y \
    && apt-get install -y vim \
    && apt-get install -y net-tools \
    && apt-get install -y memcached \
    && apt-get install -y cron

docker-compse.yml

version: "3.3"

services:
  db:
    image: mysql:5.7
    volumes:
      - ./db_data:/var/lib/mysql:consistent
    ports:
      - "3303:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: vagrant
      MYSQL_DATABASE: wp_database
      MYSQL_USER: root
      MYSQL_PASSWORD: vagrant
  wordpress:
    container_name: my-site
    build: .
    depends_on:
      - db
    volumes:
      - ./my-site-wp:/var/www/html/:consistent
    ports:
      - "8001:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: vagrant
      WORDPRESS_DB_NAME: wp_database
volumes:
  db_data:
  my-site-wp:

2 个答案:

答案 0 :(得分:3)

对于撰写文件中的每个容器,您可以在yaml中添加运行命令标志,该标志将在容器启动后运行命令。这将在每次启动时运行。另一方面,Dockerfile中的命令仅在构建映像时运行。例如:

 db:
    image: mysql:5.7
    volumes:
      - ./db_data:/var/lib/mysql:consistent
    command: # bash command goes here
    ports:
      - "3303:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: vagrant
      MYSQL_DATABASE: wp_database
      MYSQL_USER: root
      MYSQL_PASSWORD: vagrant

但是,这不是您要追求的。您为什么会把另一个容器中的一个容器弄乱? depends_on标志应重新启动下游服务。看来您的Memcache实例没有停靠,因此,您正在尝试使其适合应用程序级逻辑,这与Docker相反。此代码应位于机器或协调器(例如Kubernetes)的基础上。

答案 1 :(得分:3)

...有时我需要在容器(WordPress)上重新启动Apache ...

不要那样做。这是一个非常非常糟糕的习惯。您将容器像服务器一样对待,并修复可能发生的问题。可以将其视为单个应用程序-如果它破裂,请重新启动整个程序。

docker-compose restart wordpress

或者甚至重新启动整个堆栈。

docker-compose restart

cattle not pets那样处理您的容器:

简单地说,“牛而不是宠物”的口号暗示,当基础设施出现故障时,工作不应停顿,也不应由一整队人(或一个专门的所有者)来将其护理回来健康。不同于需要爱,关怀和更多金钱的宠物,您的基础设施应该由可以像牛一样对待的组件组成-自给自足,易于替换,可以被成百上千的人管理。与需要特别注意的VM或物理服务器不同,可以更灵活地旋转,复制,销毁和管理容器。)