我无法在直接写入其中的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 环保标志确实起作用。但是我遇到了问题,因为:
部分问题是MySQL需要一些时间才能准备好数据库,用户名和密码设置。我还为时过早。
由于某些原因,我需要指定本地主机: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
这样做时不需要做任何事情。
答案 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"