我对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容器也停止了并且服务无法正常工作
问题的核心是什么以及如何解决?
答案 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