Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在docker compose文件中使用的Dockerfile中定义环境变量_Docker_Docker Compose_Dockerfile - Fatal编程技术网

在docker compose文件中使用的Dockerfile中定义环境变量

在docker compose文件中使用的Dockerfile中定义环境变量,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我的情况如下,我有一个这样结构的项目: project/ | |______docker-compose.yml |______database/ |______Dockerfile |______webapp/ |______Dockerfile 我的问题是数据库容器构建。我的数据库/Dockerfile如下所示: FROM mysql:8.0.3 ENV MYSQL_ROOT_PASSWORD=secret ENV MYSQL_DATABASE=clients

我的情况如下,我有一个这样结构的项目:

project/
|
|______docker-compose.yml
|______database/
       |______Dockerfile
|______webapp/
       |______Dockerfile
我的问题是
数据库
容器构建。我的
数据库/Dockerfile
如下所示:

FROM mysql:8.0.3
ENV MYSQL_ROOT_PASSWORD=secret
ENV MYSQL_DATABASE=clients
EXPOSE 3306
我的
docker compose.yml
文件如下所示:

version: "3"
services:
database-server:
  build: ./database
  ports:
    - 3306:3306
如上所述,我在我的
Dockerfile
中定义了
ENV
变量(
MYSQL\u ROOT\u PASSWORD
MYSQL\u DATABASE
),因此我希望在使用
docker compose
的构建过程中使用它们。但他们没有

仅当我使用
Dockerfile
docker build
命令在
project/database
中手动构建容器时,才会使用My
ENV
变量

Dockerfile
|
|
| [Variables are available here]
|
|
docker-compose.yml
|
|
| [Variables are NOT available here]
|
docker run
有可能做我想做的事吗?我想在它的
Dockerfile
中定义与特定容器相关的所有内容,并保留
docker compose.yml
来定义容器之间的关系和链接

谢谢

更新

如@Tim所问,以下是我的
docker compose up的输出:

Starting root_database-server_1 ... done
Starting root_webapp_1 ... done
Attaching to root_database-server_1, root_webapp_1
database-server_1  | error: database is uninitialized and password option is         not specified
database-server_1  |   You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
...
... Rest of the log is fine..

没有必要仅仅为了这个目的而建立一个本地形象

version: '3'

services:

   database-server:
     image: mysql:8.0.3
     ports:
       - "3306:3306"
     environment:
       MYSQL_ROOT_PASSWORD: password
       MYSQL_DATABASE: clients
它有更好的文档记录,更易于维护

You can use them like this:
version: "3"
services:
database-server:
  build: ./database
  ports:
    - 3306:3306
  environment:
    - MYSQL_ROOT_PASSWORD_VARIABLE_FOR_DOCKER_ENV=${MYSQL_ROOT_PASSWORD}
    - MYSQL_DATABASE_VARIABLE_FOR_DOCKER_ENV=${MYSQL_DATABASE}
更新: 在您的情况下,您可以轻松做到:

environment:
  - MYSQL_ROOT_PASSWORD_VARIABLE_FOR_DOCKER_ENV=${MYSQL_ROOT_PASSWORD}
  - MYSQL_DATABASE_VARIABLE_FOR_DOCKER_ENV=${MYSQL_DATABASE}

然而,正如安德烈亚斯所说,把它们放在码头上更整洁。除非这些值经常变化。虽然我怀疑docker compose使用的是比您期望的更新图像更旧的图像,但我对密码的情况表示怀疑。试试这个:

docker compose down
停止并移除堆栈中使用的任何现有容器。如果所有操作都已停止,则可以使用
docker compose rm

docker compose build
使docker compose使用yml文件中的生成方向重新生成所有内容


docker compose up
重新启动堆栈。docker compose应该使用ENV集合拾取新构建的
数据库服务器
映像。

它对我来说很好。你能给出
docker compose-up
的输出吗?你能详细说明你是如何传递变量的吗?@TimWolla,谢谢你的回复,我添加了输出。@YamaçKurtuluş我把它们放在
docker compose
文件中,然后在
docker compose
中使用它。当我做一个
docker组合时
Dockerfile
中不考虑它们。我不想把它们放在
docker compose.yml
中。。是否可能?@user3426711是否正在启动过时的docker映像?OP希望在Dockerfile中保留配置,并仅使用docker compose定义容器之间的关系。然而,我也会这样做,既漂亮又干净+1谢谢你的回答,我知道这一点,但我的用例只是一个例子。我想知道是否可以将所有与容器相关的内容封装在
Dockerfile
中,并且只保留
docker compose.yml
用于架构描述。先生,您是对的,您的建议解决了我的问题。谢谢你的回答!