How to develop in Wordpress with Docker? - wordpress

I have a docker container with installed WP and I want to create a new custom theme for it, but I don't want to install wp on own machine. Can I develop a new theme only via Docker container?
UDP:
I solved my problem in this way:
1) in docker-composer.yml in a wordpress field need create a field
volumes:
- ./wordpress:/var/www/html
2) Create in your file system the directory wordpress and run docker-compose build and then docker-compose up. Files will be moved in your directory and you can work with them and see a result in localhost.

you can try to login into container (make sure it is running) using following command
#>docker exec -it <container-name-or-id> sh
After that you can edit and create themes inside this container.

Related

Docker-compose re-run existing contain

Yesterday I created a docker container with
docker-compose up -d
(and docker-compose.yaml file). It created a wordpress site, a database, phpmyadmin, etc.)
I made some changes to the wordpress installation, content, etc. I then shut it down with:
docker-compose down -volumes
This morning I wanted to run this container again and run the docker-compose up -d command again and when I visited the url it showed a wordpress configuration wizard instead of the existing installation from yesterday. In hindsight, it makes sense. Not sure why I expected not to create a new container. I then deleted the install* file from wp-admin but it didn't help.
Are the changes from my yesterday's wp installation lost? Have I overwritten everything?
Generally, how can I re-start an existing container with docker/docker-compose
by using docker-compose down -volumes you deleting :
Stops containers and removes containers, networks, volumes, and images created by up
see this
you may use docker-compsoe start/stop instead to stop or start your running containers
The command
docker-compose down
will stop all your containers, delete all your containers and remove any networks defined in your docker compose file.
It does not remove your volumes, by the way (unless you additonally pass the -v flag to the command).
So your command
docker-compose down --volumes
will also remove any volumes.
If you want to persist your wordpress installation for development purpose but want to be able to remove and create containers during development you can mount volumes on your host machine. E.g. for your database data or also for your wordpress source code (if needed).
See also here: https://docs.docker.com/compose/wordpress/
Take a look at the docker compose file provided there and specifically take a look at the volume directives.
In the example the database files are mounted on your host machine so that they don't vanish if you remove the database container.
If you are already using volumes in your docker compose file than you can simply remove the --volumes flag from the docker-compose down command
You can recreate a service inside compose file with following command.
for example you have wordpress,mysql,nginx services inside compose file.
docker-compose -f docker-compose.yml up -f --build wordpress
this command recreate your container

Editing AWX CSS in Docker Container

I'm hoping someone has some expertise with AWX running as a Docker container. We've switched on the Azure AD authentication and I'd like to hide the local login modal via CSS. It seems that the CSS files are generated on startup and any changes to app.xxxxxxxx.css in /var/lib/awx/public/static/css don't seem to have any effect, and are newly generated upon restart anyway. I was wondering if there was a source CSS file I could edit so I can make changes and keep them through a reboot. Any help would be appreciated.
Docker image: ansible/awx_web
AWX Version: 7.0.0.0
Here was my solution to this.
I copied the static folder from the awx_web container:
docker cp id:/var/lib/awx/public/static/ /somefolder/static/
This will copy all of the HTML/CSS/JS elements of the web application to a local folder so that you can edit the files and keep your changes through a reboot.
This particular issue required me edit the app.xxxxxxx.css file in /static/css/ and find the styling for "btn LoginModal-signInButton" and change the visibility to hidden.
The next step was to mount the locally copied static folder from earlier to the static folder inside the container. I navigated to the 'awxcompose' directory (in my case it was /var/awxcompose) and added the following line to the docker-compose.yml file under awx_web > volumes:
- "somefolder/static/:/var/lib/awx/public/static/:ro"
Then once I was ready to push my changes, I re-made the container using docker-compose:
docker-compose down && docker-compose up -d
And to make sure the containers remained in this state after a reboot, I added the following line to my crontab:
#reboot docker-compose -f /var/awxcompose/docker-compose.yml up -d

How do I change file permissions on ElasticBeanstalk before docker image gets built?

I am deploying a Docker image (Wordpress) on Elastic Beanstalk using a single container deployment.
My deployment zip file includes:
public folder containing a complete wordpress build
Dockerfile
.ebextensions/permissions.config
The standard Wordpress image creates a volume VOLUME /var/www/html and in my Dockerfile I do
COPY ./public /var/www/html
Now the problem is that I cannot upload media using Wordpress admin dashboard.
Unable to create directory wp-content/uploads/2019/02. Is its parent directory writable by the server?
I've tried to change the permissions on the uploads folder using the EB config in .ebextensions/permissions.config
container_commands:
91writable_dirs:
command: |
chmod -R 777 /var/app/current/public/wp-content/uploads
cwd: "/var/app/current"
I see from the logs that the docker image gets built before running chmod. I've seen on other SO posts that some run the script on /var/app/ondeck/, but that fails with the directory doesn't exist
Despite all the above, my question is actually how do I get to upload media to Wordpress with my current setup.
EDIT: When I attach a shell to the docker container and change the file permissions of wp-content/uploads in the VOLUME /var/www/html I am able to upload media. So how can this be made permanent on the VOLUME?
Whenever wordpress docker image is built and run, the docker ENTRYPOINT of the wordpress image is executed first. Hence your command to change the directory permissions is not getting executed.
This ENTRYPOINT is a bash script located in /usr/local/bin/docker-entrypoint.sh
If you want your command to be executed, you could add your command to this script and it will be called every time your container starts.
You could do it the following way -
Start your container and copy the contents of the existing
docker-entrypoint.sh
Create a new docker-entrypoint.sh outside the container and edit
that script to add your chmod command at appropriate location.
In your Dockerfile add a line to copy this new entrypoint to the
location /usr/local/bin/docker-entrypoint.sh

How to enable theme on WordPress on Docker

I am using docker to run a develop environment for several wordpress themes / plugins. However, I can't figure out how to enable my themes automatically on container creation. Normally I would just use wp-cli for this. I have created a custom image that extends the official wordpress image, but I can't figure out how to make the wp-cli commands run after the /var/www/html folder get's setup (I think this is created by the wordpress image entrypoint script). If I put the commands in a "RUN" command in the dockerfile, the commands just fail since the /var/www/html directory is empty. However, if I connect to the container once it is setup, the directory is populated, and wp-cli works just fine. How can I run a command after the entrypoint.sh from the parent image is run?
Here is the content of my dockerfile (which does not work):
FROM wordpress
MAINTAINER Me!
COPY docker-install/wp-cli.phar /usr/local/bin/wp
WORKDIR /var/www/html
RUN chmod u+x /usr/local/bin/wp
RUN /usr/local/bin/wp core install --title="Test WP Site" --admin_user=admin --admin_password=something --admin_email=my#cool.email --url=localhost:8080 --allow-root
RUN /usr/local/bin/wp theme activate mytheme --allow-root
The short answer: You can't. The ENTRYPOINT and CMD is are used at Docker container runtime, not build time. In this case, the Wordpress environment is actually started at container runtime so you can't interact with it during a build.
The long answer: You might be able to help accomplish your goals by using Docker Compose to create two services, one for Wordpress and another for the Wordpress CLI variant (see the cli tags at https://hub.docker.com/_/wordpress/) with a volumes_from the first one. Then, you could use docker-compose run cli-service wp-cli command to run your commands.
I created a prepare.sh file that contains commands I want to run before Apache starts, and then added this to the Dockerfile:
COPY ./prepare.sh /prepare.sh
RUN chmod +x /prepare.sh
CMD /prepare.sh && apache2-foreground
You should create a script that install themes after docker-entrypoint. The name has to start with apache2 (docker-entrypoint checks name of CMD param https://github.com/docker-library/wordpress/blob/0a5405cca8daf0338cf32dc7be26f4df5405cfb6/php5.6/apache/docker-entrypoint.sh#L26), for example apache2-setup-wordpress.sh.
Dockerfile would be like this
FROM wordpress:4.7.3
COPY apache2-setup-wordpress.sh /usr/local/bin
RUN chmod +x /usr/local/bin/apache2-setup-wordpress.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-setup-wordpress.sh", "apache2-foreground"]

Extending base WordPress docker image to download latest wp-content folder

I'm trying to extend a base WordPress image (https://github.com/docker-library/wordpress/blob/b807f1285869a220a5f72b935901603e5bde8822/php5.6/apache/Dockerfile)
I basically create a script in the Docker file that I want to execute when the container starts up to download the latest wp-content folder.
The base image has the following:
ENTRYPOINT ["docker-entrypoint.sh"] CMD ["apache2-foreground"]
I'm new to Docker so thought I could add the following to my extended docker file in order to overwrite the wp-content folder:
CMD /application/getwebsitecontent
Where getwebsitecontent is just a script to pull down the folder. The script works fine.
The problem is if I do this, it seems to override the command in the base image so I end up with no WordPress install. How do I ensure that both ENTRYPOINT and CMD are run from the base and then extend with my own script?
I'm trying to achieve the latest website content being downloaded from backup location on each container start.
When you overwrite the entry point the original will not work. What you need to do when using your own entry point I that you need to copy everything from the old one into to the new you created. You can see it's content in github repository or when you run it locally and browse it's contents

Resources