【问题标题】:Dockerizing a command line applicationDocker 化命令行应用程序
【发布时间】:2019-10-16 10:16:06
【问题描述】:

我使用 symfony 3.4 创建了一个不需要显示任何网页的命令行应用程序。

我一般会运行如下命令:

php bin/console MY_COMMAND_NAME

我想将应用程序 dockerize 并与其他人共享,因此在我的项目的根目录中创建了一个 docker-compose.yml 文件,如下所示:

version: "3.3"
services:
    web:
        image: php:7.3-cli

然后我运行 docker-compose up,然后我通过以下命令检查了 PHP 版本,它显示了我的正确版本:

docker run php:7.3-cli php -v

但是,当我运行 docker ps 时,它没有显示任何容器正在运行。

我的问题是如何在我的项目根目录中运行命令。仅供参考,我在 Windows 10 Home Edition 上使用 Docker Toolbox,我的项目位置是:

C:\Users\{my_user_name}\Desktop\folder_1\folder_2

【问题讨论】:

  • docker 容器需要在CMD 中定义一个长时间运行的进程才能保持运行。 php-cli 不是这样的。
  • 您需要一个 docker run -v 选项或一个 Docker Compose volumes: 选项将主机目录内容挂载到容器中以使其可见。
  • @DavidMaze。我是一个非常新的码头工人。你能告诉我我的 docker-compose.yml 文件应该是什么样子吗?

标签: php docker symfony docker-compose


【解决方案1】:

docker 容器需要在CMD 中定义一个长时间运行的进程才能保持运行。 php-cli 不是这样的。如果你运行composer up,你会看到这样的:

$ docker-compose up

Creating network "tempphpdocker_default" with the default driver
Pulling web (php:7.3-cli)...
7.3-cli: Pulling from library/php
b8f262c62ec6: Pull complete
a98660e7def6: Pull complete
4d75689ceb37: Pull complete
639eb0368afa: Pull complete
2cdbfdb779b1: Pull complete
e0b637fa9606: Pull complete
da7333b0ef25: Pull complete
01d65ff46009: Pull complete
673e50bed3b9: Pull complete
bf6c6e34305d: Pull complete
Digest: sha256:1453f5ef0d4d1d424ed8114dd90a775bdec06cc6fb3bbae9521dcb4ca0c8ca90
Status: Downloaded newer image for php:7.3-cli
Creating tempphpdocker_web_1 ... 
Creating tempphpdocker_web_1 ... done
Attaching to tempphpdocker_web_1
web_1  | Interactive shell
web_1  | 
tempphpdocker_web_1 exited with code 0

退出码为0。这意味着你在docker镜像php:7.3-cli中的命令已经成功运行并完成了。

要正确 dockerize 您的应用程序,您应该通过编写您自己的 docker 文件并使用将您的 CLI 程序捆绑到其中的正确的 COPY 调用来覆盖它。你的Dockerfile 应该看起来像这样:

FROM php:7.3-cli

RUN mkdir -p /opt/workdir/bin
RUN mkdir -p /opt/workdir/vendor

COPY bin/ /opt/workdir/bin
COPY vendor/ /opt/workdir/vendor

WORKDIR /opt/workdir
CMD php ./bin/console COMMAND

您可以简单地构建并运行此Dockerfile,或者如果您更喜欢docker-compose,您可以在与Dockerfile 相同的文件夹中定义docker-compose.yml

version: "3.3"
services:
    web:
        image: php-custom
        build: ./

请注意,docker 化的应用程序只能访问 docker 镜像中的文件和文件夹。您应该将本地文件系统的volumes 绑定到容器,然后它才能真正在您的文件系统上运行。

【讨论】:

    【解决方案2】:

    快速而肮脏的修复让您的容器运行只需覆盖 docker-compose 中的容器命令。

    version: "3.3"
    services:
      web:
        image: php:7.3-cli
        command: tail -f /dev/null
    
    

    当你运行 docker-compose up 时,它会保留 docker 容器,但它不会做任何事情,只会让 在容器内运行命令

    docker exec -it php-cli_web_1 ash
    
    

    我的问题是如何在我的项目根目录中运行命令 目录。

    正如@David 所说,您需要将宿主项目挂载到 docker-compose 中的容器中。

    例如

    您的项目放置在主机/home/myporject 上,将项目安装在 docker-compose 中,它将在容器中可用。然后你可以更新你的 docker-compose 命令来运行脚本。

    记住

    容器的生命就是 docker-compose 命令的生命

    执行完成后,您的容器将在执行后死亡。所以你的容器会一直运行到php:7.3-cli /app/your_script.php这个脚本完成。

    version: "3.3"
    services:
      web:
        image: php:7.3-cli
        command: php:7.3-cli /app/your_script.php
        volumes:
          - /home/myporject:/app
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-15
      • 2013-07-09
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多