如何使用docker compose在docker映像和入口点之间运行命令? docker compose v3

如何使用docker compose在docker映像和入口点之间运行命令? docker compose v3,docker,command,docker-compose,dockerfile,Docker,Command,Docker Compose,Dockerfile,每当我运行docker compose up时,我都会尝试运行一些特定于应用程序的命令,比如composer update,让我的docker-compose.yml文件看起来像这样 version: '3' services: app1: image: laraedit/laraedit ports: - 3000:80 volumes: - ./appfolder:/var/www/appfolder 如果我在入口点运行我的第一

每当我运行docker compose up时,我都会尝试运行一些特定于应用程序的命令,比如
composer update
,让我的docker-compose.yml文件看起来像这样

version: '3'
services:
  app1:
    image: laraedit/laraedit 
    ports:
        - 3000:80
    volumes:
        - ./appfolder:/var/www/appfolder
如果我在入口点运行我的第一个run命令,它将覆盖默认的laraedit/laraedit正在运行的所有命令。(至少我这么认为,因为当我的entrypoint命令完成时,容器总是停止)

我不想打扰laraedit/laraedit启动的过程,我只想在一旁执行几个命令

如果我没有使用docker compose,那么我将在本地使用laraedit/laraedit Dockerfile,然后我可以编辑它并在其中的某个位置添加一个RUN语句

但由于我没有Dockerfile,而且我无法在不中断容器正常启动的情况下创建入口点,因此我不知道如何在每次运行
docker compose
时自动运行这些枯燥的命令

我尝试过的事情:

  • 添加我自己的(替换laraedit的)
  • 运行(阻止其启动的)
  • 将它们作为一个命令运行(命令未执行)

您需要使用自定义图像扩展laraedit/laraedit图像。 您可以使用如下简单的Dockerfile:

FROM laraedit/laraedit
COPY my_entrypoint.sh /my_entrypoint.sh
RUN chmod +x /my_entrypoint.sh
ENTRYPOINT /my_entrypoint.sh
my_entrypoint.sh
是一个脚本,包含初始化命令并在其末尾调用原始入口点,例如:

#!/bin/sh

my_init_cmd1
my_init_cmd2

...

/original/entrypoint/script/path
通过读取原始laraedit Dockerfile,可以获得
/original/entrypoint/script/path

假设您将上面的2个文件放在docker-compose.yml旁边名为
docker
的目录中,然后您需要调整docker-compose.yml,如下所示:

version: '3'
services:
  app1:
    build: ./docker/
    ports:
    - 3000:80
    volumes:
    - ./appfolder:/var/www/appfolder

另外,如果您不想使用“laraedit/laraedit”图像,则必须使用不同的Dockerfile对其进行编辑。通过新创建的Dockerfile创建新图像并在撰写文件中使用它。我也在等待答案:-)。这是原始的dockerfile吗?如果是,当覆盖
命令
入口点
时,
supervisords
是否正在运行?@ItayB是,这是正确的dockerfile。当覆盖
docker compose.yml
中的
命令
入口点
值时,
supervisord
永远不会运行。你可以做一个难看的破解,在后台启动supervisord(&),然后运行你的东西,然后在为真时睡1。。有道理?有道理是的。但对我来说太难看了。