【问题标题】:Dockerfile - ERROR: for php Cannot start service php: OCI runtime create failed: container_linux.go:348: starting container process caused "execDockerfile - 错误:对于 php 无法启动服务 php:OCI 运行时创建失败:container_linux.go:348:启动容器进程导致“exec
【发布时间】:2018-07-21 17:27:40
【问题描述】:

我是使用 Docker 的新手,我正在尝试创建一个本地开发环境来运行我的自定义 php 或 laravel 项目。

这是我的文件夹结构

root-dir
- src // this is where my php / laravel code lives
-- info.php // file having phpinfo(); just to ensure that everything has set properly
- docker // this is where all containers and config settings live
-- php etc..
- docker-compose.yml

这是我的 docker/php/Dockerfile

FROM ubuntu:18.04

ENV TERM=linux

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update
RUN apt-get install -y curl zip unzip --no-install-recommends apt-utils ca-certificates
RUN apt-get install -y --no-install-recommends php7.2-fpm \
                       php7.2-cli \
                       php7.2-mysql \
                       php7.2-xml \
                       php7.2-curl \
                       php7.2-bcmath \
                       php7.2-bz2 \
                       php7.2-curl \
                       php7.2-zip \
                       php7.2-gd \
                       php7.2-gettext \
                       php7.2-zip \
                       php7.2-soap \
                       php7.2-odbc \
                       php7.2-json \
                       php7.2-geoip \
                       php7.2-igbinary \
                       php7.2-imagick \
                       php7.2-mbstring \
                       php7.2-msgpack \
                       php7.2-ssh2 \
                       php7.2-memcached \
                       php7.2-xdebug \
                       php7.2-intl \
                       php7.2-opcache \
                       php7.2-readline

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* ~/.composer


COPY php.ini /etc/php/$PHPVER/cli/php.ini
COPY php.ini /etc/php/$PHPVER/fpm/php.ini
COPY 20-xdebug.ini /etc/php/$PHPVER/cli/conf.d/20-xdebug.ini
COPY 20-xdebug.ini /etc/php/$PHPVER/fpm/conf.d/20-xdebug.ini
COPY php-fpm-startup /usr/bin/php
CMD /usr/bin/php

EXPOSE 9000

ENTRYPOINT ["/usr/bin/php"]
CMD ["--version"]

当我运行docker-compose up -d 时,我收到此错误

ERROR: for php  Cannot start service php: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/usr/bin/php\": permission denied": unknown

这是我的 nginx/default.conf 文件

server {

  listen 80 default_server;
  root /var/www/html;
  index index.html index.php;

  charset utf-8;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location = /favicon.ico { access_log off; log_not_found off; }
  location = /robots.txt { access_log off; log_not_found off; }

  access_log off;
  error_log /var/log/nginx/error.log error;

  sendfile off;

  client_max_body_size 100m;

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
  }

  location ~ /\.ht {
    deny all;
  }
}

【问题讨论】:

  • 所以你有一些文件和一个错误。但问题在哪里?您想知道当您从 Docker 切换到使用 VirtualBox VM 时是否不会出现该错误吗?或者您是否应该从使用 nginx 切换到 Apache?始终在您的帖子中包含适当的疑问句。 (即不是:“有什么想法吗?”,而是类似于“我可以用什么替换 nginx 来摆脱这个错误?”)

标签: php docker dockerfile


【解决方案1】:

将用户添加到您的 dockerfile,它将为您执行 php 二进制文件,例如:

....
RUN ["chmod", "+x", "/usr/bin/php"]
RUN ["chmod", "+x", "-R", "/var/log"]
EXPOSE 9000
RUN useradd -ms /bin/bash admin
USER admin
ENTRYPOINT ["/usr/bin/php"]
CMD ["--version"]

【讨论】:

  • 你的意思是任何用户名都可以在我的原生操作系统上做或挖掘?
  • 它将添加一个新用户,所有后续命令将专门执行ENTRYPOINT和CMD中的一个。您还可以根据linux.die.net/man/8/useradd 使用-g 和` -G ` 标志来授予此新用户提升的权限@
  • 恐怕没有用,当我尝试 docker-compose -up -d 时仍然出现同样的错误
  • 我已经更新了答案。请立即检查。添加RUN ["chmod", "+x", "/usr/bin/php"]。似乎您的 php 二进制文件没有足够的权限运行。
  • 我做了你说的更改,在组合之后我运行docker ps,它只显示 nginx 容器处于活动状态。我已经运行docker logs <nginx-cont-id> and get this 2018/07/21 19:45:40 [emerg] 1#1: host not found in upstream "php" in /etc/nginx/conf.d/default.conf:25 nginx: [ emerg] 在/etc/nginx/conf.d/default.conf:25`的上游“php”中找不到主机
【解决方案2】:

回复:聊天会议

但是您担心容器停止运行的原因。

如果您的命令执行完毕,容器将终止 如果您的命令失败并且 tty 挂掉,容器将终止。

换句话说,如果您的命令从未运行或运行并完成,如您的示例中所示

php -verson

是您尝试运行的代码 完成后容器将终止 如果你没有捕捉到stdout,你将永远不会看到这个执行 并且容器将像什么都没发生一样终止。

【讨论】:

  • 不确定我是否完全理解,但我如何让 php 容器始终处于活动状态?所以当我运行组合时,我所有的容器都会继续运行
  • 哈哈,是的,这就是 docker 容器的难点所在。你的entrypoint 应该是一个脚本什么的。我不使用 php,但我没有看到人们只是在 docker 中运行 php 二进制文件,通常你从一个 nginx 容器开始并启动 nginx,它将为你的 php 文件提供服务 nginx 在后台运行,因此会一直运行直到它崩溃或关闭
  • 你能给我一个entrypoint 的例子,即使不是在 php 中,所以至少我大致知道在 php 中谷歌搜索什么?当我运行docker-compose up -d 时,我所有的容器(nginx、php、mysql 等)都从 docker-compose.yml 启动,所以 nginx 将首先启动,对吗?
  • 你有一个 web/http 服务器在你为 php 使用的 docker 容器上运行吗?我猜不 你是使用 nginx 作为 web/http 服务器还是代理?如果是 web 服务器,那么我建议你从一个 NGINX docker 容器开始,然后尝试让你的基于 php 的站点首先在那里工作docker pull nginx:latest 然后运行它docker run -it -p9000:9000 8888:80 nginx:latest sh 先让它工作然后担心 docker compose docker compose 文件是用于确保所有支持容器一起运行。你需要先让你的容器工作。
  • @Zee303 这不是聊天,也不是论坛。这是一个质量问题和答案的网站。如果您还不能发表评论,那是有原因的。您应该避免的一件事是在答案中包含有关该问题的 cmets(“我无法加入聊天”和“希望这会有所帮助,当我不能直接参与讨论时很难”)(这不是因为有 5这两个句子中的语法错误)。
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2020-10-27
相关资源
最近更新 更多