PHP Docker容器无故退出

时间:2019-02-08 20:02:00

标签: php docker docker-compose

我对docker和docker-compose比较陌生,所以我制作了这个文件

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "8050:80"
    volumes:
      - ./code:/code
      - ./site.conf:/etc/nginx/conf.d/default.conf
    links:
      - php
  php:
    image: php:7.3-fpm-alpine3.9
    command: apk --update add php7-mysqli
    volumes:
      - ./code:/code
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

出于某种原因,该行

command: apk --update add php7-mysqli

无缘无故停止php容器,只显示dock_php_1 exited with code 0

因此,我的Web容器也停止了并且服务无法正常工作

问题的核心是什么以及如何解决?

2 个答案:

答案 0 :(得分:2)

这是因为您告诉容器在启动时运行apk更新命令,此操作完成并以有效退出代码0 ...退出。

要使其运行该apk更新命令并仍使用php容器,您需要使用自己的扩展程序扩展php映像,以创建基本php映像的“自定义映像”(有点像扩展PHP类) ),然后将该apk更新作为dockerfile的一部分运行。

这相当容易做到,您的dockerfile看起来像这样:

FROM php:7.3-fpm-alpine3.9

RUN apk --update add php7-mysqli

您可以将其另存为./php/Dockerfile

然后将您的docker-compose.yml文件更新为:

...
php:
  build: ./php
  volumes:
...

删除命令:部分

然后,在docker-compose up上,使用扩展包内部的apk更新构建扩展映像,作为容器的额外层,并继续运行原始映像提供的标准php命令。

这里是build:指令的文档,因为您可以使用它进行很多其他有趣的操作,  例如,如果您不想将其放置在子目录中,则指定Dockerfile;如果要将文件烘烤到新映像中,请提供context: https://docs.docker.com/compose/compose-file/#build

答案 1 :(得分:1)

我假设您真正需要的是使用Docker Compose的“ build”选项,并提供安装所需软件包的Dockerfile(运行apk --update add php7-mysqli)。另外,您可以构建一个新的Docker映像并直接在Docker Compose文件中使用它。

Docker撰写“命令”是要覆盖默认的Docker映像命令(Dockerfile的CMD命令)

更多说明可以在这里找到: https://medium.freecodecamp.org/docker-entrypoint-cmd-dockerfile-best-practices-abc591c30e21