PHP-FPM无法使用docker-compose

时间:2017-05-03 09:45:04

标签: docker docker-compose

我在这里遇到一个非常奇怪的问题,我不确定我做错了什么,一定是简单但我无法弄明白。

我的docker-compose.yml:

mysql:
  image: mysql:5.7
  container_name: mysql
  environment:
    - MYSQL_ROOT_PASSWORD=aaa
    - MYSQL_DATABASE=aaa
    - MYSQL_USER=aaa
    - MYSQL_PASSWORD=aaa
    - MYSQL_PORT=3306
    - MYSQL_HOST=localhost

php-fpm:
  build: .
  dockerfile: php-fpm/Dockerfile
  container_name: php-fpm
  volumes:
    - ../app:/var/www/html
  links:
    - mysql
  environment: 
    PHP_php5enmod: 'bcmath gd gmp intl mbstring mysql mysqli pcntl pdo_mysql redis zip sockets'

caddy:
  build: .
  dockerfile: caddy/Dockerfile
  container_name: caddy
  volumes:
      - ../app:/var/www/html
      - ./caddy/Caddyfile:/etc/Caddyfile
      - ./caddy/certs:/root/.caddy
  ports:
   - "80:80"
   - "443:443"
  links:
   - mysql
   - php-fpm

php-fpm的Dockerfile:

FROM alterway/php:7.1-fpm

# update
RUN apt-get update && apt-get install -y bash zip unzip

# require the asset plugin
RUN composer global require "fxp/composer-asset-plugin:^1.3.1"

# copy the entrypoint
COPY ./php-fpm/docker-entrypoint.sh /root/docker-entrypoint.sh

# setup permissions
RUN chmod +x /root/docker-entrypoint.sh

# Clean up, try to reduce image size (much as you can on Debian..)
RUN apt-get autoremove -y \
    && apt-get clean all \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /usr/share/doc /usr/share/man /usr/share/locale

ENTRYPOINT ["/root/docker-entrypoint.sh"]

(如果我注释掉ENTRYPOINT容器就开始了就好了)

在我的docker-entrypoint.sh文件中,我只是尝试运行迁移:

#!/bin/bash

# run the migration
/var/www/html/yii migrate/up --interactive=0 --migrationPath=/var/www/html/vendor/twisted1919/yii2-options/migrations

所以我想做的就是在容器启动后立即运行shell脚本,但似乎没有任何工作。

另一件事,如果我在我的Dockerfile中注释掉ENTRYPOINT,当容器启动并执行数据库迁移时,它会抱怨它找不到有效的mysql驱动程序,但如果我登录容器并尝试运行迁移手动,然后它工作得很好,所以可能有问题alterway/docker-php

2 个答案:

答案 0 :(得分:0)

我认为添加health check可能会帮助您。

这样你可以告诉docker-compose在启动php-fpm之前等待mysql健康

答案 1 :(得分:0)

好的,所以问题确实是mysql还没有为连接做好准备。我没有去做健康检查的事情,我只是用shell脚本包装来启动/停止/重启docker-compose,并且还调用容器内部需要的脚本,这样就更容易了。