我发现我有多个环境(例如test和prod)很常见,但我希望启动的Docker容器在两种环境中都是相同的.唯一的区别是我想要使用的应用程序配置env-file.由于我有多个容器和它们之间的依赖关系,我想使用docker-compose.但是afaik我只能指定文件env-file内部docker-compose.yml(参见docs).如果是这种情况,那么我需要将原始docker-compose.yml文件克隆到两个不同的文件(一个用于测试,一个用于prod),只是为了指向不同的env文件.这意味着我必须维护两个docker-compose.yml文件而不是一个,如果我做了任何更改,我需要更新这两个文件.
这真的是根据设计吗?为什么docker-compose不让我指明--env-file我什么时候docker-compose up或docker-compose run?
我正在使用docker-compose来构建一个完整的开发堆栈.
该应用程序需要一个mysql服务器才能工作.
mysql服务器是docker-compose设置的外部容器:
mysql:
image: mysql:5.6
volumes:
- /data/mysql:/var/lib/mysql
- ./docker/mysql.d:/etc/mysql/conf.d
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
Run Code Online (Sandbox Code Playgroud)
该应用程序有自己的docker-compose.yml并引用mysql容器:
my-application:
build: . # the Dockerfile resides in the current folder
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:mysql
environment:
DOCKER_ENVIRONMENT: dev
DB_NAME: local_db
DB_PASS: password
DB_USER: root
DB_HOST: # how to set the mysql's IP address?
Run Code Online (Sandbox Code Playgroud)
我无法在docker-compose中传递它们,因为它是动态的.
我知道应用程序知道mysql IP地址,因为我设置了某些变量:
application-container$ env|grep ADDR
MYSQL_PORT_3306_TCP_ADDR=172.17.0.241
Run Code Online (Sandbox Code Playgroud)
然而,这不是我的要求DB_HOST.
我可以以某种方式映射变量DB_HOST或以不同方式设置它吗?
如何在计算机上打开/运行YML撰写文件?我已经安装了Docker for Windows和Docker工具,但无法弄清楚如何.
我使用 mac 10.11.6 El capan 并安装了 docker 工具箱,我正在尝试使用 docker compose 构建选项,但我抛出了一些错误,如下所示,
kj$ docker-compose -f docker-compose-dev.yml build
Traceback (most recent call last):
File "docker-compose", line 6, in <module>
File "compose/cli/main.py", line 71, in main
File "compose/cli/main.py", line 124, in perform_command
File "compose/cli/command.py", line 41, in project_from_options
File "compose/cli/command.py", line 113, in get_project
File "compose/config/config.py", line 380, in load
File "compose/config/config.py", line 380, in <listcomp>
File "compose/config/config.py", line 513, in process_config_file
File "compose/config/config.py", line 221, in get_service_dicts
File "distutils/version.py", line 46, in …Run Code Online (Sandbox Code Playgroud) 我似乎无法找到一种方法让端口发布以docker-compose run尽可能相同的方式工作docker run.
使用Docker Compose(以及端口映射docker-compose.yml)会产生"连接失败"错误curl:
$ docker-compose run flask
* Running on http://0.0.0.0:2048/ (Press CTRL+C to quit)
$ curl http://localhost:2048/
curl: (7) Failed connect to localhost:2048; Connection refused
Run Code Online (Sandbox Code Playgroud)
但是,手动将端口传递到时,一切正常docker run:
$ docker run -p 2048:2048 --name flask -t flask_image
* Running on http://0.0.0.0:2048/ (Press CTRL+C to quit)
$ curl http://localhost:2048
Hello World!
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
Dockerfile
FROM centos:7
# Install EPEL repo.
RUN rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# Install Python and Pip.
RUN …Run Code Online (Sandbox Code Playgroud) docker-compose文件https://docs.docker.com/compose/compose-file/#/volumes-volume-driver显示了相对于撰写文件安装主机子目录的各种方法.
例如:
卷:#只需指定一个路径,让Engine创建一个卷 - /var/lib/mysql
#指定绝对路径映射 - /opt/data:/ var/lib/mysql
#主机上的路径,相对于Compose文件 - ./cache:/tmp/cache
#用户相对路径 - 〜/ configs:/ etc/configs /:ro
#Named volume - datavolume:/ var/lib/mysql
是否可以在特定位置安装命名卷的子目录?例如下面的东西,我试过,但似乎不起作用.
# Named volume
- datavolume/sql_data:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)
我假设我可以通过将数据卷安装到类似位置/data然后在每个容器的Dockerfiles中来管理这个,创建从子目录到位置的符号链接.
例如,在docker-compose.yml文件中
volumes:
- datavolume:/data
Run Code Online (Sandbox Code Playgroud)
然后在容器Dockerfile中
RUN ln -s /data/sql_data /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)
我开始沿着这条路走下去,但它变得凌乱而且无法正常工作.在我放弃这种方法或投入时间调试它之前,我想确保没有办法只指定命名vollume的子目录.
我有一个使用Docker for Mac的docker-compose项目,当我启动计算机时自动启动.
我通常会启动项目docker-compose up -d,但是甚至docker-compose stop在关闭之前运行它会在启动时再次自动启动它.
我不知道具体实现这个.我该如何禁用它?
我有一个运行 Nuxt.js (Vue.js) 应用程序的容器,定义如下docker_composes.yml:
version: '3'
services:
vue:
build: .
image: registry.gitlab.com/something/app:${TAG}
environment:
- apiPath="http://localhost:5000/"
- filePath="http://localhost:3000/"
ports:
- "${EXPOSED_PORT:-80}:${NUXT_PORT:-3000}"
restart: always
Run Code Online (Sandbox Code Playgroud)
该应用程序是一个前端。我在本地主机上运行后端,在端口上5000。当容器化应用程序尝试连接到http://localhost:5000/它时失败。
我有哪些选择?我不想将后端放入docker_composes.yml并通过链接连接它们。如果这是唯一的选择,我会的。
什么是使用container_name的docker-compose.yml文件?我可以将它用作文件中hostname的服务名称吗docker-compose.yml?
此外,当我hostname在服务下明确写入时,它是否会覆盖由service name?
我正在尝试使用 nginzx、flask 和 react 创建 docker-compose 设置。我使用 react-create-app ( https://github.com/facebook/create-react-app )启动了我的 react 应用程序,但尚未对其进行任何更改。
我的反应应用程序的 Dockerfile 是:
FROM node:10
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
COPY package*.json ./
RUN npm install --verbose
# Bundle app source
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)
撰写脚本是:
version: '3.1'
services:
nginx:
image: nginx:1.15
container_name: nginx
volumes:
- ../:/var/www
- ./nginx-dev.conf:/etc/nginx/conf.d/default.conf
ports:
- 80:80
networks:
- my-network
depends_on:
- flask
- …Run Code Online (Sandbox Code Playgroud)