How to run wp cli in docker-compose.yml
Well there are a couple of problems. The first one is that those two containers (wordpress
and wordpress-cli
) don't share a volume. So while wordpress
has a wordpress installation ready, the wordpress-cli
doesn't.
So you can add volumes to both containers, and then wordpress-cli
will find the wordpress installation.
Then there's a second problem: the wordpress:latest
and wordpress:cli
images both run with the user www-data
, but the problem is that the individual www-data
users have different user-id's:
$ docker run --rm wordpress:latest grep www-data /etc/passwd www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin$ docker run --rm wordpress:cli grep www-data /etc/passwd www-data:x:82:82:Linux User,,,:/home/www-data:/bin/false
It seems they aren't exactly compatible here. So if you use a shared volume you have to make sure they both use the same user-id. I solved this by having the wordpress:cli
run with the user xfs
which also has the user id 33.
The last problem is that your containers have dependencies on each other. Wordpress needs a running MySQL instance and the wordpress-cli needs also the MySQL and the Wordpress to be ready. To make sure MySQL is ready for the wordpress cli installation you either use something like "wait-for-it" or in a simple case you can just wait a couple of seconds and then try it.
I have tested all those changes and came up with the following docker-compose.yml
. I have annotated all the changes I've made with "vstm":
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_NAME: wordpress WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_TABLE_PREFIX: "wp_" WORDPRESS_DEBUG: 1 # vstm: add shared volume volumes: - wp_data:/var/www/html wordpress-cli: depends_on: - db - wordpress image: wordpress:cli # vstm: This is required to run wordpress-cli with the same # user-id as wordpress. This way there are no permission problems # when running the cli user: xfs # vstm: The sleep 10 is required so that the command is run after # mysql is initialized. Depending on your machine this might take # longer or it can go faster. command: > /bin/sh -c ' sleep 10; wp core install --path="/var/www/html" --url="http://localhost:8000" --title="Local Wordpress By Docker" --admin_user=admin --admin_password=secret --admin_email=foo@bar.com ' # vstm: add shared volume volumes: - wp_data:/var/www/htmlvolumes: db_data: # vstm: add shared volume wp_data:
It uses a docker-volume but you can also map it to a filesystem. Depends on how you plan to use your docker-compose.
This one worked for me:
wpcli: depends_on: - mysql - wordpress image: wordpress:cli links: - mysql:db entrypoint: wp command: "--info" container_name: ${COMPOSE_PROJECT_NAME}_wpcli volumes: - ${WORDPRESS_DATA_DIR:-./wordpress}:/var/www/html working_dir: /var/www/html
Note that in the line:
links: - mysql:db
mysql = name of my servicedb = alias name I gave it, can be anything
Then you issue run wp like so:
docker-compose run --rm wpcli WORDPRESS_COMMAND
Source: https://medium.com/@tatemz/using-wp-cli-with-docker-21b0ab9fab79
this's my first answer at Stack Overflow :">
Actually, your question inspired me, and @vstm's answer guided me a bit.
You could try my piece of code:
1.wait-for-mysql.sh
#!/bin/bash -eHOST=$(echo $WORDPRESS_DB_HOST | cut -d: -f1)PORT=$(echo $WORDPRESS_DB_HOST | cut -d: -f2)CMD=$@until mysql -h $HOST -P $PORT -D $WORDPRESS_DB_NAME -u $WORDPRESS_DB_USER -p$WORDPRESS_DB_PASSWORD -e '\q'; do >&2 echo "Mysql is unavailable - sleeping..." sleep 2done>&2 echo "Mysql is up - executing command"exec $CMD
2.compose.yml
version: '3.9'services: wordpress: image: wordpress:5.7.0-php7.4-apache ports: - "80:80" volumes: - ./wp-data/:/var/www/html/ networks: wp-net: {} wp-cli: image: wordpress:cli-2.4.0-php7.4 depends_on: - wordpress volumes: - ./wait-for-mysql.sh:/wait-for-mysql.sh - ./wp-data:/var/www/html/ # shared with wordpress service user: "33" command: > /wait-for-mysql.sh wp core install --path="/var/www/html" --url="http://your-url-here" --title=your-title-here --admin_user=your-user-here --admin_password=your-password-here --admin_email=your-email-here} --skip-email networks: wp-net: {}networks: wp-net: {}
For your reference: