什么是docker-compose

时间:2019-09-04 01:13:55

标签: docker docker-compose

我无法在直接写入其中的docker-compose文件中获取环境变量。与命令行类似的配置也可以像这样正常工作:

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

这是一个MySQL实例,它设置了三个环境变量:MYSQL_DATABASE,MYSQL_USER和MYSQL_PASSWORD。稍后,我可以向其中docker exec -it container_name bash启动bash,并启动客户端mysql -u username -p并建立连接。

但是,当我在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

然后,当我使用mysql客户端时,就好像该用户不存在。如何设置它,使其等效于docker run期间的-e标志?

编辑

docker-compose --version显示docker-compose version 1.24.1, build 4667896b

编辑2 环保标志确实起作用。但是我遇到了问题,因为:

  1. 部分问题是MySQL需要一些时间才能准备好数据库,用户名和密码设置。我还为时过早。

  2. 由于某些原因,我需要指定本地主机:mysql --host=localhost -u user -p。指定127.0.0.1不起作用。

  3. 由于某些未知原因,运行--host容器时,来自官方docker映像的示例stack.yml不必指定adminer。如果我清除了管理员,则需要给出--host标志。

  4. 有时,MySQL守护程序将停止。可能与我的挂载目标/var/lib/mysql有关,但我不确定。

  5. command: --default-authentication-plugin=mysql_native_password实际上很重要。我不知道为什么当我docker run这样做时不需要做任何事情。

2 个答案:

答案 0 :(得分:1)

您yml中的环境参数需要-在它们前面可能是罪魁祸首

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

答案 1 :(得分:1)

docker-compose接受数组或字典这两种类型的ENV,最好加倍使用或尝试两种方法。

环境

  

添加环境变量。您可以使用数组或   字典。任何布尔值;是,否,是,否,需要   用引号括起来以确保它们不会转换为True或False   通过YML解析器。

     

仅具有键的环境变量将解析为它们的值   正在运行Compose的计算机,这可能有助于秘密或   主机特定的值。

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

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

docker-compose version可能会有所帮助,因为3.1可以正常工作。如官方图片所示,因此最好尝试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

此外,最好调试一切看起来都正确但缺少一些次要语法的情况。您可以在使用DB之前对其进行测试。

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

运行docker-compose up

现在在测试环境中进行测试和调试。

docker exec -it composeenv_intronexon_db_1 ash -c "printenv"