在docker-compose.yaml文件中运行docker容器内的命令的语法是什么?

q1qsirdb  于 2023-03-22  发布在  Docker
关注(0)|答案(2)|浏览(186)

我有一个图像定义如下:

php-enc:
      container_name: php-apache
      image: php:8.0-apache
      volumes:
        - ./php/src:/var/www/html/
      ports:
        - 8000:80
      
      depends_on:
            - db

现在我想在构建这个容器后在容器中运行一个命令。

docker exec -it php-apache bash

这将我带入容器,我使用另一个命令

docker-php-ext-install mysqli

在此之后,mysqli被安装到php-apache容器中。
现在我想将所有这些都包含到docker-compose文件中,所以我尝试了
一个三个三个一个
但它不工作。容器停止运行
我想知道如何在docker-compose.yml中使用command

62lalag4

62lalag41#

您docker-composer.yml文件中的命令应该如下所示:

command: sh -c 'docker-php-ext-install mysqli && apache2-foreground'

为什么你的php-apache停止运行,原因是:
命令:sh -c "docker-php-ext-install mysqli"不会在后台运行,这是容器保持运行所必需的

6l7fqoea

6l7fqoea2#

您应该在Dockerfile中运行任何安装和设置命令。这将为您提供包含应用程序依赖项的自定义映像。
最小的形式将包含一个Dockerfile,其中只有一个带有当前图像名称的FROM行,然后RUN您需要的任何命令。

FROM php:8.0-apache
RUN docker-php-ext-install mysqli
version: '3.8'
services:
  php-enc:
    build: .
    volumes:
      - ./php/src:/var/www/html/
    ports:
      - 8000:80
    depends_on:
      - db
  db: { ... }

**确保从Compose文件中删除image:行。**保留它显然可以工作,但用您构建的内容替换实际的php:8.0-apache映像,这会导致稍后的混乱结果。

还可以考虑使用Dockerfile COPY指令在映像中包含应用程序代码

COPY ./php/src/ /var/www/html/

这还将允许您从Compose文件中删除volumes:,并为您提供一个自包含的可运行映像。您可以将该映像推送到注册表并在其他地方运行它,而无需单独复制应用程序代码。这也意味着,如果不重建映像,主机系统上的编辑将无法在容器中看到(这在大多数编译语言中是一个正常的工作流程,但在PHP中可能不是这样)。
还有其他Dockerfile指令,如EXPOSECMD,但这里不需要它们;从基本映像继承关于如何运行主容器进程的信息。

相关问题