【问题标题】:Docker - Installing Composer /bin/sh: 1: php: not found curl: (23) Failed writing body (0 != 16133)Docker - 安装 Composer /bin/sh: 1: php: not found curl: (23) 写入正文失败 (0 != 16133)
【发布时间】:2019-06-05 16:51:55
【问题描述】:

您好,我正在为我的 laravel 项目创建一个 dockerfile。到目前为止就是这样:

FROM php:7.2-cli
FROM nginx
FROM node:8
MAINTAINER zachary tyhacz

# does not install mysql
# mysql is outside container

RUN apt-get update -y && apt-get install -y openssl zip unzip git
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www/public
COPY . /var/www/public

COPY nginx.conf /etc/nginx/sites-available/domain
RUN ln -s /etc/nginx/sites-available /etc/nginx/sites-enabled

RUN npm install
RUN composer install

# sets up the database
CMD php artisan migrate:fresh --seed

# resets configuration files
CMD php artisan config:cache

# refreshes routes
CMD php artisan route:cache

# enables serve
CMD php artisan serve --host=0.0.0.0 --port=436

EXPOSE 8080/udp
EXPOSE 8080/tcp
EXPOSE 80/udp
EXPOSE 80/tcp
EXPOSE 436/tcp
EXPOSE 436/udp

在 docker 标签上创建一个图像,它得到这个指令:

Step 6/22 : RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

它会抛出此错误并停止。

/bin/sh: 1: php: not found
curl: (23) Failed writing body (0 != 16133)

我不确定出了什么问题。我认为这可能是权限问题或目录问题。

感谢任何人帮助我的任何建议

另外,我帮助我创建这个 dockerfile 的参考是这样的: https://buddy.works/guides/laravel-in-docker

【问题讨论】:

  • 你可以或多或少只有一个 FROM 和一个 CMD,而且你是在没有 PHP 的情况下从 node:8 图像库构建的。
  • 没有“或多或少”之分,每一种只允许一个,最近定义的优先。此外,每个容器安装多个服务通常被认为是不好的做法。看看 docker-compose 或 kubernetes 之类的东西。

标签: php laravel docker composer-php dockerfile


【解决方案1】:

在 Dockerfile 中只能有一个使用 FROM 的基础镜像。基本上,这告诉 docker 从什么开始。在你的情况下,你有几个FROMs,所以看起来 Docker 只是取了你给它的最后一个,在这种情况下是node:8。所以 PHP 永远不会被安装。

要解决此问题,您需要选择一个基础映像(例如 php),并在其上安装其他依赖项,因此您可以使用 @ 在 php 映像之上手动安装 nginx 和节点987654324@。您可能还需要考虑构建一个单独的 nginx 映像。在可能的情况下,将您的服务分成不同的图像被认为是一种很好的做法。

另外,不要使用多个CMD 条目,而是使用一个小的启动shell 脚本。例如

#!/usr/bin/env bash
set -e
php artisan migrate:fresh --seed
php artisan config:cache
php artisan route:cache
exec php artisan serve --host=0.0.0.0 --port=436

把它放在一个名为 start.sh 或类似的脚本中,然后在你的 Dockerfile 中,使用

CMD ["./start.sh"]

然后,您可能还想为您的 nginx 服务启动第二个容器。您可以使用 docker run 手动执行此操作,但我建议您查看 docker-compose。它可以帮助您一次构建和运行多个容器。

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 2023-02-17
    • 2016-08-21
    • 2015-12-02
    • 1970-01-01
    • 2021-10-20
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多