我试图用supervisor
来解决Wordpress的Docker镜像时遇到的困难。该代码来自信誉良好的来源:
https://github.com/how2dock/docbook/tree/master/ch01/supervisor
这是我的Dockerfile
FROM ubuntu:19.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get -y install \
apache2 \
php7.2 \
php7.2-mysql \
supervisor \
wget
RUN echo 'mysql-server mysql-server/root_password password root' | debconf-set-selections && \
echo 'mysql-server mysql-server/root_password_again password root' | debconf-set-selections
RUN apt-get install -qqy mariadb-server
RUN wget http://wordpress.org/latest.tar.gz && \
tar xzvf latest.tar.gz && \
cp -R ./wordpress/* /var/www/html && \
rm /var/www/html/index.html
RUN (/usr/bin/mysqld_safe &); sleep 5; mysqladmin -u root -proot create wordpress
COPY wp-config.php /var/www/html/wp-config.php
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 80
CMD ["/usr/bin/supervisord"]
和我的wp-config.php
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'root');
/** MySQL database password */
define('DB_PASSWORD', 'root');
/** MySQL hostname */
define('DB_HOST', 'localhost');
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
supervisord.conf
[supervisord]
nodaemon=true
[program:mysqld]
command=/usr/bin/mysqld_safe
autostart=true
autorestart=true
user=root
[program:httpd]
command=/bin/bash -c "rm -rf /run/httpd/* && /usr/sbin/apachectl -D FOREGROUND"
构建容器; docker build -t wordpress .
并使用docker run -d -p 82:80 wordpress
运行Web服务器。浏览到http://localhost:82,期望找到一个闪亮的新WP安装-仅找到:
Access denied for user 'root'@'localhost'
我尝试了几种数据库用户名/密码组合。我是Docker的新手。我想念什么?
答案 0 :(得分:0)
为什么您要用此Dockerfile重新发明轮子?并违反经验法则,每个容器只能进行一次处理?
对于MySQL,拥有Dockerfile并使用构建时间并不那么简单。 MySQL服务启动后,您需要在运行时使用入口点创建用户。
将建议像这样简单地使用offical WordPress image and MySQL。
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
现在问您一个问题,原因是您的Docker容器中没有用户。
RUN (/usr/bin/mysqld_safe &); sleep 5; mysqladmin -u root -proot create wordpress
每个run指令在其自己的shell中执行。因此,上面的命令将无法完成您期望的工作。您需要像MySQL官方dockerfile一样将这些步骤移至entrypoint。
另一个建议是,将MySQL用作基本映像并根据需要扩展,但是再次需要一些适当的入口点才能使用MySQL。它不像WordPress或节点容器。