在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
中手动构建容器时,才会使用MyENV
变量
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
用于架构描述。先生,您是对的,您的建议解决了我的问题。谢谢你的回答!