簡體   English   中英

在docker-compose文件中使用的Dockerfile中定義ENV變量

[英]Defining ENV variables in a Dockerfile that is used in a docker-compose file

我的情況如下,我有一個具有這種結構的項目:

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

如上所述,我在Dockerfile定義了我的ENV變量( MYSQL_ROOT_PASSWORDMYSQL_DATABASE ),因此我希望在使用docker-compose時在構建期間使用它們。 但他們沒有!

我使用DockerfileDockerfile docker build命令在project/database中手動構建容器時,才會使用我的ENV變量。

Dockerfile
|
|
| [Variables are available here]
|
|
docker-compose.yml
|
|
| [Variables are NOT available here]
|
docker run

有可能做我想做的事嗎? 我想在它的Dockerfile定義與特定容器相關的Dockerfile ,並保持docker-compose.yml來定義容器之間的關系和鏈接。

謝謝!

UPDATE

正如@Tim所問,這是我的docker 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

它記錄更好,更易於維護。

我懷疑docker-compose正在使用比您期望的更新圖像更舊的圖像。 嘗試這個:

docker-compose down停止並刪除堆棧中使用的任何現有容器。 如果所有內容都已停止,您可以使用docker-compose rm

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

docker-compose up以重新啟動堆棧。 docker-compose應該使用ENV集合來獲取新構建的database-server映像。

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}

然而,正如安德烈亞斯所說,保持他們在碼頭工作室的構成更加整潔。 除非這些值經常變化。 我懷疑密碼就是這種情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM