在docker-compose文件中使用的Dockerfile中定义ENV变量

时间:2018-02-14 15:10:21

标签: docker docker-compose dockerfile

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

project/
|
|______docker-compose.yml
|______database/
       |______Dockerfile
|______webapp/
       |______Dockerfile

我的问题在于database容器构建。我的database/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

如上所述,我在ENV中定义了MYSQL_ROOT_PASSWORD变量(MYSQL_DATABASEDockerfile),因此我希望在构建时使用它们我使用docker-compose。但他们没有!

我的ENV变量仅在我使用project/databaseDockerfile命令在docker build中手动构建容器时使用。

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..

3 个答案:

答案 0 :(得分:2)

无需为此目的构建本地图像。

version: '3'

services:

   database-server:
     image: mysql:8.0.3
     ports:
       - "3306:3306"
     environment:
       MYSQL_ROOT_PASSWORD: password
       MYSQL_DATABASE: clients

记录更好,更易于维护。

答案 1 :(得分:1)

我怀疑docker-compose正在使用比您期望的更新图像更旧的图像。试试这个:

docker-compose down停止并删除堆栈中使用的任何现有容器。如果所有内容都已停止,您可以使用docker-compose rm

docker-compose build使docker-compose在yml文件中使用构建方向重建所有内容。

docker-compose up重新启动堆栈。 docker-compose应该使用ENV设置来获取新建的database-server图像。

答案 2 :(得分:0)

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}

然而,正如安德烈亚斯所说,将它们留在码头工作室中更加整洁。除非这些值经常变化。我怀疑这是密码的情况,但