当前位置:   article > 正文

docker-compose.yml 语法说明_docker-compose working_dir 无效

docker-compose working_dir 无效

YAML模板文件语法

默认的模板文件是docker-compose.yml,其中定义的每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)来自动构建。

其他大部分都跟docker run 中类似。 如果使用build指令,在Dockerfile中设置的选项(例如:CMD,EXPOSE,VOLUME,ENV等)将自动被获取,无需在docker-compose.yml中再次被设置。

1、image

指定为镜像名称或镜像ID。如果镜像不存在,Compose将尝试从互联网拉取这个镜像,例如: image: ubuntu image: orchardup/postgresql image: a4bc65fd

2、build

指定Dockerfile所在文件夹的路径。Compose将会利用他自动构建这个镜像,然后使用这个镜像。 build: ./dir

3、command

覆盖容器启动后默认执行的命令。 command: bundle exec thin -p 3000

链接到其他服务容器,使用服务名称(同时作为别名)或服务别名(SERVICE:ALIAS)都可以

  1. links:
  2. - db
  3. - db:database
  4. - redis

注意:使用别名会自动在服务器中的/etc/hosts 里创建,如:172.17.2.186 db,相应的环境变量也会被创建。

链接到docker-compose.yml外部的容器,甚至并非是Compose管理的容器。参数格式和links类似。 external_links:

  1. - redis_1
  2. - project_db_1:mysql
  3. - project_db_2:sqlserver

6、ports

暴露端口信息。 宿主机器端口:容器端口(HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主机器将会随机分配端口)都可以。

  1. ports:
  2. - "3306"
  3. - "8080:80"
  4. - "127.0.0.1:8090:8001"

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

7、expose

暴露端口,与posts不同的是expose只可以暴露端口而不能映射到主机,只供外部服务连接使用;仅可以指定内部端口为参数。

  1. expose:
  2. - "3000"
  3. - "8000"

8、volumes

设置卷挂载的路径。可以设置宿主机路径:容器路径(host:container)或加上访问模式(host:container:ro)ro就是readonly的意思,只读模式。

  1. volumes:
  2. - /var/lib/mysql:/var/lib/mysql
  3. - /configs/mysql:/etc/configs/:ro

9、volunes_from

挂载另一个服务或容器的所有数据卷。

  1. volumes_from:
  2. - service_name
  3. - container_name

10、environment

设置环境变量。可以属于数组或字典两种格式。 如果只给定变量的名称则会自动加载它在Compose主机上的值,可以用来防止泄露不必要的数据。

  1. environment:
  2. - RACK_ENV=development
  3. - SESSION_SECRET

11、env_file

从文件中获取环境变量,可以为单独的文件路径或列表。 如果通过docker-compose -f FILE指定了模板文件,则env_file中路径会基于模板文件路径。 如果有变量名称与environment指令冲突,则以后者为准。

  1. env_file: .env
  2. env_file:
  3. - ./common.env
  4. - ./apps/web.env
  5. - /opt/secrets.env

环境变量文件中每一行都必须有注释,支持#开头的注释行。

  1. # common.env: Set Rails/Rack environment
  2. RACK_ENV=development

12、extends

基于已有的服务进行服务扩展。例如我们已经有了一个webapp服务,模板文件为common.yml.

  1. # common.yml
  2. webapp:
  3. build: ./webapp
  4. environment:
  5. \ - DEBUG=false
  6. \ - SEND_EMAILS=false

编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。 development.yml

  1. web:
  2. extends:
  3. file: common.yml
  4. service:
  5. webapp:
  6. ports:
  7. \ - "8080:80"
  8. links:
  9. \ - db
  10. envelopment:
  11. - DEBUG=true
  12. db:
  13. image: mysql:5.7

后者会自动继承common.yml中的webapp服务及相关的环境变量。

13、net

设置网络模式。使用和docker client 的 --net 参数一样的值。

  1. # 容器默认连接的网络,是所有Docker安装时都默认安装的docker0网络.
  2. net: "bridge"
  3. # 容器定制的网络栈.
  4. net: "none"
  5. # 使用另一个容器的网络配置
  6. net: "container:[name or id]"
  7. # 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样
  8. net: "host"

Docker会为每个节点自动创建三个网络: 网络名称 作用 bridge 容器默认连接的网络,是所有Docker安装时都默认安装的docker0网络 none 容器定制的网络栈 host 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样 附录: 操作名称 命令 创建网络 docker network create -d bridge mynet 查看网络列表 docker network ls

14、pid

和宿主机系统共享进程命名空间,打开该选项的容器可以相互通过进程id来访问和操作。

pid: "host"

15、dns

  1. 配置DNS服务器。可以是一个值,也可以是一个列表。
  2. dns: 8.8.8.8
  3. dns:
  4. - 8.8.8.8
  5. - 9.9.9.9

16、cap_add,cap_drop

添加或放弃容器的Linux能力(Capability)。

  1. cap_add:
  2. - ALL
  3. cap_drop:
  4. - NET_ADMIN
  5. - SYS_ADMIN

配置DNS搜索域。可以是一个值也可以是一个列表。

  1. dns_search: example.com
  2. dns_search:
  3. - domain1.example.com
  4. \ - domain2.example.com
  5. working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares

这些都是和 docker run 支持的选项类似。

  1. cpu_shares: 73
  2. working_dir: /code
  3. entrypoint: /code/entrypoint.sh
  4. user: postgresql
  5. hostname: foo
  6. domainname: foo.com
  7. mem_limit: 1000000000
  8. privileged: true
  9. restart: always
  10. stdin_open: true
  11. tty: true

docker-compose.yml实例

  1. version: "2"
  2. services:
  3. ### console
  4. console:
  5. build:
  6. context: ./images/console
  7. args:
  8. # console 容器 www-data用户密码
  9. - USERPASS=root
  10. - GIT_NAME=yangnan
  11. - GIT_EMAIL=20706149@qq.com
  12. - INSTALL_YARN=false
  13. volumes_from:
  14. - php-fpm
  15. - nginx
  16. - mysql
  17. - redis
  18. volumes:
  19. - ./ssh:/home/www-data/.ssh
  20. links:
  21. - redis
  22. - mysql
  23. tty: true
  24. ### php-fpm
  25. php-fpm:
  26. build: ./images/php-fpm
  27. volumes:
  28. - ./app/:/var/www/
  29. ### nginx
  30. nginx:
  31. image: nginx
  32. ports:
  33. - "8081:80"
  34. volumes_from:
  35. - php-fpm
  36. volumes:
  37. - ./logs/nginx/:/var/log/nginx/
  38. - ./images/nginx/sites:/etc/nginx/conf.d/
  39. links:
  40. - php-fpm
  41. ### mysql
  42. mysql:
  43. image: mysql
  44. ports:
  45. - "7706:3306"
  46. environment:
  47. MYSQL_ROOT_PASSWORD: "123"
  48. MYSQL_DATABASE: "test"
  49. MYSQL_USER: "root"
  50. MYSQL_PASSWORD: "123"
  51. volumes:
  52. - ./data/mysql:/var/lib/mysql
  53. ### redis
  54. redis:
  55. image: redis
  56. ports:
  57. - "6379:6379"
  58. volumes:
  59. - ./data/redis:/data

注意事项: 使用compose对Docker容器进行编排管理时,需要编写docker-compose.yml文件,初次编写时,容易遇到一些比较低级的问题,导致执行docker-compose up时先解析yml文件的错误。比较常见的是yml对缩进的严格要求。

yml文件还行后的缩进,不允许使用tab键字符,只能使用空格,而空格的数量也有要求,经过实际测试,发现每一行增加一个空格用于缩进是正常的。 比如:

  1. web:
  2. <空格>build:
  3. <空格><空格>command:
  4. ...

否则,很容易引起各种 yaml.scanner.ScannerError:的错误提示。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/74149
推荐阅读
相关标签
  

闽ICP备14008679号