我正在使用docker-compose.yaml
构建我的应用程序以进行本地开发,使用两个Dockerfiles
- 一个用于app(WordPress),另一个用于nginx。由于这是一个使用Jenkins管道构建的特定应用程序,我无法更改Dockerfiles,但我希望能够在本地测试环境,就像我在登台和生产服务器上一样。
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
我认为在compose文件中设置environment
就足够了,并且这将被使用(app-admin
是使用WordPress的php部分的container_name
)。
在我的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
命令中无法识别。怎么会?
所以事实证明我不能这样做:
https://github.com/moby/moby/issues/34482
因为--from
需要图像名称(我试图从之前的构建服务传递给它,但在我的情况下它是动态的)。这可以在Jenkins中运行,因为我正在执行docker build
命令,并且变量在bash脚本中可用...
COPY --from
不支持变量,但FROM
确实如此。
以下示例使用多阶段构建,以帮助您从第一个图像中提取所需的任何内容。
ARG DOCKER_IMAGE_NAME_PHP=php:7.3
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
为此,您必须在Dockerfile中使用ARG
。
您正在建造时,docker-compose.yml中的environment
不可用。
您也可以在docker-compose.yml中使用arg: