docker - 什么是docker-compose中的docker run -e等效项

标签 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。稍后,我可以将bash启动到docker 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客户端时,就好像该用户不存在。如何在docker运行期间将其设置为等同于-e标志?

编辑
docker-compose --version显示docker-compose version 1.24.1, build 4667896b
编辑2
环保标志确实起作用。但是我遇到了问题,因为:
  • 问题的部分原因是MySQL需要一些时间才能准备好数据库,用户名和密码设置。我还为时过早。
  • 由于某种原因,我需要指定localhost:mysql --host=localhost -u user -p。指定127.0.0.1将不起作用。
  • 出于某些未知的原因,当运行--host容器时,来自官方docker镜像的示例stack.yml不必指定adminer。如果我清除了管理员,则需要给出--host标志。
  • 有时MySQL守护程序将停止。这可能与我的挂载目标/var/lib/mysql有关,但我不确定。
  • command: --default-authentication-plugin=mysql_native_password实际上很重要。我不知道为什么当我做docker run时我不需要做任何事情。
  • 最佳答案

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

    环境

    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:
    
    

    要么
    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"
    

    关于docker - 什么是docker-compose中的docker run -e等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780321/

    相关文章:

    docker - 如何使用docker-compose挂载主机目录,运行主机时指定 "~/path/on/host",不在docker-compose文件中

    DOCKER_REGISTRY 值未设置构建错误

    php - docker-compose mysql环境PASSWORD和ROOT_PASSWORD的区别

    docker - docker-compose up-使用云docker-machine构建变得非常慢

    python - docker compose up 生成 (2005, "Unknown MySQL server host ' db' (-2)") 错误

    Docker:在分配给网络的默认值中找不到可用的、不重叠的 IPv4 地址池

    docker - Docker中的Artifactory重定向到不同的端口

    docker - RabbitMq-Docker-compose-如何修复 'Connection refused 127.0.0.1:5672'异常

    Docker Compose 保持容器运行

    docker - 维护标记的最新docker镜像版本的最有效方法是什么