docker compose环境变量未在Dockerfile中设置变量

时间:2019-04-21 19:38:30

标签: php docker nginx docker-compose dockerfile

我正在使用docker-compose.yaml,两个Dockerfiles构建用于本地开发的应用程序-一个用于应用程序(WordPress),另一个用于nginx。由于这是一个使用Jenkins管道构建的特定应用程序,因此我无法更改Dockerfile,但是我希望能够像在登台服务器和生产服务器上一样在本地进行相同的环境测试。

php部分有效,但nginx失败。 Nginx的Dockerfile如下所示:

FROM nginx:latest

COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd

COPY --from=DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/

CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

DOCKER_IMAGE_NAME_PHP部分失败,

  

错误:服务'nginx'生成失败:来自标志值DOCKER_IMAGE_NAME_PHP的无效:无效的引用格式:存储库名称必须为小写

在我的docker-compose.yaml中,我有nginx部分

nginx:
    build:
      context: .
      dockerfile: Dockerfile.static
    container_name: web-service
    working_dir: /var/www
    volumes:
      - .:/var/www
    environment:
      - "DOCKER_IMAGE_NAME_PHP=app-admin"
      - "DOCKER_IMAGE_NAME_NGINX=web-service"
    depends_on:
      - app
    ports:
      - 8090:80

我认为在组合文件中设置environment就足够了,并且可以使用(app-admin是WordPress的php部分的container_name)。 / p>

在我的Jenkins管道脚本中,这些名称用于手动构建应用和静态图像(使用docker build -t DOCKER_IMAGE_NAME_PHP -f Dockerfile.php),然后将名称设置为env,例如

echo -e "DOCKER_IMAGE_NAME_PHP=$DOCKER_IMAGE_NAME_PHP" >>env

编辑

就像答案一样,我尝试在args键下添加build

build:
  context: .
  dockerfile: Dockerfile.static
  args:
    - "DOCKER_IMAGE_NAME_PHP=app-admin"

然后在我添加的Dockerfile

FROM nginx:latest

COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd

ARG DOCKER_IMAGE_NAME_PHP

COPY --from=$DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/

CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

但是我仍然得到错误。我已经尝试过${DOCKER_IMAGE_NAME_PHP},但这无济于事。

奇怪的是,添加RUN echo $DOCKER_IMAGE_NAME_PHP时,我可以看到

Step 6/8 : RUN echo $DOCKER_IMAGE_NAME_PHP
 ---> Running in 0801fcd5b77f
app-admin

但是COPY命令中无法识别。怎么会来?

编辑2

所以事实证明我不能这样做:

https://github.com/moby/moby/issues/34482

因为--from需要图像名称(我试图从先前的构建服务传递给它,但在我看来,它是动态的)。由于我正在执行docker build命令,因此这在Jenkins中有效,并且变量在bash脚本中可用...

2 个答案:

答案 0 :(得分:1)

COPY --from不支持变量,但FROM则支持。

下面的示例使用多阶段构建,以帮助您从第一张图像中提取所需的任何内容。

FROM ${DOCKER_IMAGE_NAME_PHP} as php-image
FROM nginx:latest

COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd

COPY --from=php-image /var/www/html/ /var/www/html/

CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

一个几乎相似的例子位于docs

答案 1 :(得分:0)

为此,您必须在Dockerfile中使用ARG

  

https://docs.docker.com/engine/reference/builder/#arg

构建时,docker-compose.yml中的

environment不可用。

  

https://docs.docker.com/compose/compose-file/#environment

您也可以在docker-compose.yml中使用arg:

  

https://docs.docker.com/compose/compose-file/#args

相关问题