jjzjj

php - 如何在不需要任何 PHP 脚本的情况下保持 PHP-CLI 容器运行?

coder 2024-04-12 原文

我一直在尝试使用 Docker 和 Docker Compose 构建一个 PHP cli 容器,我想让它保持事件状态,而不需要在其中运行任何 PHP 脚本。

我已经尝试了我自己的 Dockerfile:

FROM ubuntu:16.04
ENV PATH="/root/.composer/vendor/bin:${PATH}"

RUN apt-get update && \
    apt-get -y -qq install software-properties-common \
    xvfb \
    locales && \
    locale-gen en_US.UTF-8 && \
    export LC_ALL=en_US.UTF-8 && \
    export LANG=en_US.UTF-8 && \
    add-apt-repository ppa:ondrej/php && \
    apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get -y --allow-unauthenticated install \
    php7.1-curl \
    php7.1-cli \
    php7.1-bcmath \
    php7.1-json \
    php7.1-intl \
    php7.1-mbstring \
    php7.1-mcrypt \
    php7.1-mysql \
    php7.1-xml \
    php7.1-xsl \
    php7.1-zip \
    curl \
    git \
    wget \
    pkg-config && \
    apt-get clean && \
    apt-get autoremove && \
    rm -rf /var/lib/apt/lists/*

COPY config /
RUN sh /usr/local/bin/install.sh
ENTRYPOINT bash -C '/entrypoint.sh';'bash'
CMD ["php", "-a"]

还有另一个(从 main PHP images 扩展):

FROM php:7-cli-alpine
ENV PATH="/root/.composer/vendor/bin:${PATH}"
COPY config /
RUN sh /usr/local/bin/install.sh
WORKDIR /var/wwww
CMD ["php", "-a"]

docker-compose.yml 只有这个:

version: '3.3'
services:
    webserver:
      build:
        context: .
      restart: on-failure
      env_file: .env
      environment:
          UID: ${UID}
          GID: ${GID}

最后here是包含所有内容的完整存储库,如果您想尝试一下。

问题是什么?通过运行 docker-compose up --build --force-recreate 构建容器后,它以代码 0 退出,但 docker-composer logs也没有帮助,因为它什么也没说。

查看命令行的以下输出(对于本文中的第二个 Dockerfile,因为第一个与更多内容几乎相同):

$ docker-compose up --build --force-recreate
Building webserver
Step 1/6 : FROM php:7-cli-alpine
7-cli-alpine: Pulling from library/php
90f4dba627d6: Pull complete
623a0217e4bc: Pull complete
ecbf507e7e3c: Pull complete
79a82dee0025: Pull complete
457716c6bb05: Pull complete
62e36287ffd0: Pull complete
507e98c003bc: Pull complete
b25e699baa37: Pull complete
Digest: sha256:ecae911bd22279d4883ffdc631afddc434641c67eedf49914fc62dafb5329663
Status: Downloaded newer image for php:7-cli-alpine
 ---> 1e563ea5f552
Step 2/6 : ENV PATH "/root/.composer/vendor/bin:${PATH}"
 ---> Running in 29b65c1d7def
 ---> d11c62bb5cf5
Removing intermediate container 29b65c1d7def
Step 3/6 : COPY config /
 ---> e42022d1de91
Step 4/6 : RUN sh /usr/local/bin/install.sh
 ---> Running in 749230f42e9e
All settings correct for using Composer
Downloading...

Composer (version 1.5.2) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer

Changed current directory to /root/.composer
Loading composer repositories with package information
Updating dependencies
Package operations: 21 installs, 0 updates, 0 removals
  - Installing hirak/prestissimo (0.3.7): Downloading (100%)
  - Installing symfony/stopwatch (v3.3.10): Downloading (100%)
  - Installing symfony/process (v3.3.10): Downloading (100%)
  - Installing symfony/polyfill-php72 (v1.5.0): Downloading (100%)
  - Installing paragonie/random_compat (v2.0.11): Downloading (100%)
  - Installing symfony/polyfill-php70 (v1.5.0): Downloading (100%)
  - Installing symfony/options-resolver (v3.3.10): Downloading (100%)
  - Installing symfony/finder (v3.3.10): Downloading (100%)
  - Installing symfony/filesystem (v3.3.10): Downloading (100%)
  - Installing symfony/event-dispatcher (v3.3.10): Downloading (100%)
  - Installing psr/log (1.0.2): Downloading (100%)
  - Installing symfony/debug (v3.3.10): Downloading (100%)
  - Installing symfony/polyfill-mbstring (v1.5.0): Downloading (100%)
  - Installing symfony/console (v3.3.10): Downloading (100%)
  - Installing php-cs-fixer/diff (v1.1.0): Downloading (100%)
  - Installing gecko-packages/gecko-php-unit (v2.2): Downloading (100%)
  - Installing doctrine/lexer (v1.0.1): Downloading (100%)
  - Installing doctrine/annotations (v1.5.0): Downloading (100%)
  - Installing composer/semver (1.4.2): Downloading (100%)
  - Installing friendsofphp/php-cs-fixer (v2.7.1): Downloading (100%)
  - Installing squizlabs/php_codesniffer (3.1.0): Downloading (100%)
Writing lock file
Generating optimized autoload files
Cache directory does not exist (cache-vcs-dir): 
Clearing cache (cache-repo-dir): /root/.composer/cache/repo
Clearing cache (cache-files-dir): /root/.composer/cache/files
Clearing cache (cache-dir): /root/.composer/cache
All caches cleared.
 ---> ff310362f4a5
Removing intermediate container 749230f42e9e
Step 5/6 : WORKDIR /var/wwww
 ---> fe10fd52d6b6
Removing intermediate container 6e472a693c0c
Step 6/6 : CMD php -a
 ---> Running in 789688d1346a
 ---> b1286e96580b
Removing intermediate container 789688d1346a

Successfully built b1286e96580b
Successfully tagged dockerlamp_webserver:latest
Recreating dockerlamp_webserver_1 ... 
Recreating dockerlamp_webserver_1 ... done
Attaching to dockerlamp_webserver_1
webserver_1  | Interactive shell
webserver_1  | 
dockerlamp_webserver_1 exited with code 0

$ docker-compose logs
Attaching to dockerlamp_webserver_1
webserver_1  | Interactive shell
webserver_1  | 

如何在不需要运行 PHP 脚本的情况下保持容器运行?

Note: you might be asking why not just build php-fpm|apache but the thing is I do not need any webserver because the container will be used for a command line project only (which is a WIP)

最佳答案

您正在运行 php -a,这是一个 REPL,它需要交互式 TTY。所以你需要在你的撰写中启用那些

version: '3.3'
services:
    webserver:
      build:
        context: .
      restart: on-failure
      env_file: .env
      environment:
          UID: ${UID}
          GID: ${GID}
      tty: true
      stdin_open: true

稍后如果您需要附加到它来运行命令,您将需要使用 docker

docker attach <containernameOrID>

关于php - 如何在不需要任何 PHP 脚本的情况下保持 PHP-CLI 容器运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46735302/

有关php - 如何在不需要任何 PHP 脚本的情况下保持 PHP-CLI 容器运行?的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  7. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  8. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  9. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  10. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

随机推荐