首页 > 解决方案 > docker-compose 中的 docker run -e 等效项是什么

问题描述

我无法在直接写入其中的 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。我稍后可以启动 bashdocker exec -it container_name 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客户端时,就好像用户不存在一样。如何设置它以使其等效于-edocker run 期间的标志?

编辑

docker-compose --version节目docker-compose version 1.24.1, build 4667896b

编辑 2 环境标志确实有效。但我遇到了问题,因为:

  1. 部分问题在于 MySQL 需要一些时间才能准备好数据库、用户名和密码设置。而且我检查得太早了。

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

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

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

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

标签: dockerdocker-compose

解决方案


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

推荐阅读