【问题标题】:How do use docker-compose to run commands between the docker image and the entrypoint?如何使用 docker-compose 在 docker 镜像和入口点之间运行命令?
【发布时间】:2018-02-05 06:40:18
【问题描述】:

docker compose v3

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

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

如果我在入口点运行我的首次运行命令,它将覆盖默认 laraedit/laraedit 正在运行的所有命令。 (至少我是这么认为的,因为当我的入口点命令完成时容器总是停止)

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

如果我不使用 docker-compose,那么我将在本地拥有 laraedit/laraedit Dockerfile,然后我可以对其进行编辑并在其中的某处添加 RUN 语句。

但是由于我没有 Dockerfile,而且我无法在不中断容器正常启动的情况下创建入口点,所以我不知道如何自动执行每次运行这些无聊命令的过程运行docker-compose up

我尝试过的事情:

【问题讨论】:

  • AFAIU,如果您不想使用“laraedit/laraedit”图像,则必须使用不同的 Dockerfile 对其进行编辑。通过新创建的 Dockerfile 创建新图像并在您的撰写文件中使用它。我也在等待答案:-)。
  • 这是 github.com/laraedit/laraedit-docker/blob/master/Dockerfile 原始 dockerfile 吗?如果是这样,当覆盖 commandentrypoint 时,supervisord 是否正在运行?
  • @ItayB 是的,这是正确的 dockerfile。当覆盖来自docker-compose.ymlcommandentrypoint 值时,supervisord 永远不会运行。
  • 你可以做一个丑陋的 hack,在后台启动 supervisord (&),然后运行你的东西,然后在 true 时休眠 1.. 有意义吗?
  • 有道理是的。但对我来说太丑陋了。

标签: docker command docker-compose dockerfile


【解决方案1】:

您需要使用自定义图像扩展 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多