huggie
huggie

Reputation: 18237

What is the docker run -e equivalent in docker-compose

I can't get environmental variables in a docker-compose file written directly in it to work. A similar configuration with the command line work just fine like this:

docker run --name container_name -d --network=my-net --mount type=bind,src=/Users/t2wu/Documents/Work/Dodo/Intron-Exon_expression/DockerCompose/intronexon_db/mnt_mysql,dst=/var/lib/mysql -e MYSQL_DATABASE=db_name -e MYSQL_USER=username -e MYSQL_PASSWORD=passwd mysql/mysql-server:8.0.13

This is an MySQL instance which sets three environmental variables: MYSQL_DATABASE, MYSQL_USER and MYSQL_PASSWORD. I'm later able to launch bash into it docker exec -it container_name bash and launch the client mysql -u username -p and connects just fine.

However when I write it in a docker-compose.yml:

version: "3.7"
services:
  intronexon_db:
    image: mysql/mysql-server:8.0.13
    volumes:
      - type: bind
        source: ./intronexon_db/mnt_mysql
        target: /var/lib/mysql
    environment:
      MYSQL_DATABASE: db_name
      MYSQL_USER: username
      MYSQL_PASSWORD: passwd
    networks:
      - my-net

networks:
  my-net:
    driver: bridge

Then when I use the mysql client, it's as if the user doesn't exist. How do I set it so that it is equivalent to the -e flag during docker run?

EDIT

docker-compose --version shows docker-compose version 1.24.1, build 4667896b

EDIT 2 The environmental flag did work. But I run into problem because:

  1. Part of the problem was that it takes MySQL sometime to get the database, username and password setup ready. And I was checking it way too early.

  2. I need to specify localhost for some reason: mysql --host=localhost -u user -p. Specifying 127.0.0.1 will not work.

  3. For some unknown reason the example stack.yml from the official docker image did not have to specify --host when the adminer container is run. If I wipe out the adminer, then --host flag needs to be given.

  4. Sometimes MySQL daemon will stop. It might has to do with my mount target /var/lib/mysql but I'm not certain.

  5. command: --default-authentication-plugin=mysql_native_password is actually significant. I don't know why when I did docker run I didn't need to do anything about this.

Upvotes: 0

Views: 1381

Answers (2)

Adiii
Adiii

Reputation: 59936

docker-compose accept both types of ENVs either an array or a dictionary, better to double or try both approaches.

environment

Add environment variables. You can use either an array or a dictionary. Any boolean values; true, false, yes no, need to be enclosed in quotes to ensure they are not converted to True or False by the YML parser.

Environment variables with only a key are resolved to their values on the machine Compose is running on, which can be helpful for secret or host-specific values.

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

or

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

Might be something with docker-compose version as it working fine with 3.1. as the offical image suggested, so Better to try offical image docker-compose.yml

version: '3.1'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

Also, better to debug such cases where everything seems correct but some minor syntax is missing. you can test it before working with DB.

version: "3.7"
services:
  intronexon_db:
    image: alpine
    environment:
      MYSQL_DATABASE: myDb
    command: tail -f /dev/null

run docker-compose up

Now test and debug in testing enviroment.

docker exec -it composeenv_intronexon_db_1 ash -c "printenv"

Upvotes: 1

digital-pollution
digital-pollution

Reputation: 1074

the environment params in your yml need the - in front of them could be the likely culprit

version: "3.7"
services:
  intronexon_db:
    image: mysql/mysql-server:8.0.13
    volumes:
      - ./intronexon_db/mnt_mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE: db_name
      - MYSQL_USER: username
      - MYSQL_PASSWORD: passwd
    networks:
      - my-net

networks:
  my-net:
    driver: bridge

Upvotes: 1

Related Questions