Apache 如何在Docker容器重新启动时运行命令

Apache 如何在Docker容器重新启动时运行命令,apache,docker,docker-compose,dockerfile,restart,Apache,Docker,Docker Compose,Dockerfile,Restart,我不熟悉使用Docker和Docker compose,因此,如果一些术语有误,我深表歉意 我已经获得了一个Dockerfile和dockercompose.yml,并且已经成功地构建了映像,并启动了容器(通过运行dockercompose up-d),但是我想更新一些东西,使我的过程更容易一些,因为偶尔我需要在容器上重新启动Apache(WordPress)通过以下方式访问: docker exec -it 89a145b5ea3e /bin/bash 然后键入: service apach

我不熟悉使用Docker和
Docker compose
,因此,如果一些术语有误,我深表歉意

我已经获得了一个
Dockerfile
dockercompose.yml
,并且已经成功地构建了映像,并启动了容器(通过运行
dockercompose up-d
),但是我想更新一些东西,使我的过程更容易一些,因为偶尔我需要在容器上重新启动Apache(WordPress)通过以下方式访问:

docker exec -it 89a145b5ea3e /bin/bash
然后键入:

service apache2 restart
我的第一个问题是,我需要运行另外两个服务才能使我的项目正常工作,当我运行上述
service apache2 restart
命令时,它们不会自动重新启动

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

service memcached start
service cron start
我想知道在重启
apache2
时如何始终运行这些命令

其次,我想配置我的
Dockerfile
docker 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:


对于compose文件中的每个容器,可以在yaml中添加一个run命令标志,该标志将在容器启动后运行命令。这将在每次启动期间运行。另一方面,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
然而,这不是你想要的。你为什么要把另一个容器里的容器弄得乱七八糟?
dependens_on
标志应重新启动下游服务。您的memcache实例似乎没有停靠,因此,您正在尝试将其放入应用程序级逻辑中,这与Docker相反。此代码应该在机器或编曲器(如Kubernetes)的次级别

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

不要那样做。这是一个非常非常坏的习惯。您将容器视为一台服务器,您可以在其中修复损坏的东西。把它想象成一个单一的应用程序——如果它坏了,重新启动整个该死的程序

docker-compose restart wordpress
甚至可以重新启动整个堆栈

docker-compose restart
将容器视为:

简言之,“牛而不是宠物”的口号表明,工作不应该在基础设施损坏时停止,也不应该需要一个完整的团队(或一个专业的所有者)来护理它恢复健康。不像宠物需要爱、关注和比你想花的更多的钱,你的基础设施应该由你可以像对待牛一样对待的组件组成——自给自足,易于更换,并由成百上千的人管理。与需要特别注意的虚拟机或物理服务器不同,容器可以更灵活地旋转、复制、销毁和管理。)


如果您想遵循良好的实践,您应该在
Dockerfile
中记录所有的初始化。谢谢你的提示!通过
docker compose
来完成这项工作似乎更好。我仍然有一个问题,我希望在
wordpress
容器中重新启动
cron
服务。有什么想法吗?或者我的想法是错误的。你安装cron的目的是什么?也许有另一种方法可以实现同样的目标。通常不鼓励在容器中运行多个进程。这在我的问题中可能不清楚,但我希望在
wordpress
容器上运行
service cron start
。我曾尝试通过
docker compose.yml中的
命令添加它,但似乎每当我这样做时,容器都会继续重新启动。我已经尝试过:
command:>bash-c“service cron start”
command:-service cron start
,它们在运行
docker compose up
时显示退出代码
0
127
。我完全有可能是用错误的方法来实现这一点,因此我愿意尝试在Wordpress容器上启动cron服务的不同方法。FWIW这对我有效:在
docker compose up-d
完成后,我可以运行
docker compose exec Wordpress service cron start
。但我想做的是了解如何将其合并到compose yaml中。还是有更好的方法实现同样的结果?