4

I am trying to use Docker to create a set of containers (wordpress and MySQL) that will help my local development with Wordpress. As we are running a live database, I want to mount a dump.sql file into the Docker mysql container. Below is my .yml file.

version: '2' 

services: 
  db: 
    image: mysql:latest 
    volumes: 
      - ./data:/docker-entrypoint-initdb.d #./data holders my dump.sql file
    environment: 
      MYSQL_ROOT_PASSWORD: wordpress
      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_PASSWORD: wordpress 
    volumes: 
      - ./wp-content/themes/portalV3:/var/www/html/wp-content/themes/portalV3 
      - ./wp-content/plugins:/var/www/html/wp-content/plugins 
      - ./wp-content/uploads:/var/www/html/wp-content/uploads 

Everything works, but after ~10 seconds the docker container for mysql crashes. Going through the logs, I get the following error:

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/dump.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR: Can't initialize batch_readline - may be the input source is a directory or a block device.

On closer inspection (attaching to the rebooted mysql container) I see that indeed my dump.sql file wasn't transferred to the container, but a folder with the same name was created in /docker-entrypoint-initdb.d.

Can anyone help me understand how I get docker-compose to copy my dump.sql file and import into the database?

Cheers,

Pieter

2 Answers 2

8

The problem you got with docker-entrypoint-initdb.d is that because your source 'data' is a directory and not a file, The destination file (docker-entrypoint-initdb.d) must be a directory too. And vice versa.

So either do

volumes: 
   - ./data:/docker-entrypoint-initdb.d/

or

volumes: 
   - ./data/mydump.sql:/docker-entrypoint-initdb.d/mydump.sql
2

Yes, that is how you should mount the .sql or .sh files i.e by adding a volume by mapping the SQL or .sh files to the docker container's docker-entrypoint-initdb.d folder. But, it's raising an error for some strange reason maybe because the MySQL docker version is old.

You could solve this by creating a custom image i.e,

Dockerfile

 FROM mysql:5.7
 COPY init.sql /docker-entrypoint-initdb.d/

It creates an image and also helps in running a init script while starting the container.

To use this in a compose file, put your SQL files and Dockerfile in a folder.

database
  |---init.sql
  |---Dockerfile

docker-compose.yml

 version: '3'
 services:
   mysqldb:
     image: mysqldb
     build: ./database
     container_name: mysql
     ports:
       - "3306:3306"
     environment:
       - MYSQL_ROOT_PASSWORD=root
       - MYSQL_USER=test
       - MYSQL_PASSWORD=root
       - MYSQL_DATABASE=test

By this, you could configure the environment variables easily.

Not the answer you're looking for? Browse other questions tagged or ask your own question.