如何解决为什么docker build和docker-compose builds之间的COPY路径不同?
我是Docker领域的新手,正在尝试弄清楚如何做事。我严重依赖本书Docker In Action。我已经在第10章修改了Makefile 建立我的多阶段图像。这是一个示例:
.PHONY: image-base
image-base: metadata
@echo "Building Base Image"
docker image build --tag src:$(BUILD_ID)-base \
-f src/Dockerfile \
--target baseImage \
--build-arg BUILD_ID='$(BUILD_ID)' \
--build-arg BUILD_DATE='$(BUILD_TIME_RFC_3339)' \
--build-arg VCS_REF='$(VCS_REF)' \
.
@echo "Built Base Image. BUILD_ID: $(BUILD_ID)"
## image-prod : Build the prod image
.PHONY: image-prod
image-prod: metadata image-base
@echo "Building Prod Image"
docker image build --tag src:$(BUILD_ID)-prod \
-f src/Dockerfile \
--target prodImage \
--build-arg BUILD_ID='$(BUILD_ID)' \
--build-arg BUILD_DATE='$(BUILD_TIME_RFC_3339)' \
--build-arg VCS_REF='$(VCS_REF)' \
.
@echo "Built Prod Image. BUILD_ID: $(BUILD_ID)"
我的目录结构如下:
.
├── BUILD.md
├── Makefile
├── docker-compose.yml
├── docker-dev.yml
├── docker-prod.yml
├── docker-staging.yml
├── docker-testing.yml
├── src
│ ├── Dockerfile
│ ├── README.md
│ ├── composer.json
│ ├── app
│ │ ├── <elided>
│ ├── php-apache
│ │ ├── 000-default.conf
│ │ ├── php.ini
│ │ └── <elided>
├── <elided>
这是我的docker-compose.yml文件的示例:
version: '3.8'
services:
php-apache:
image: 'src:latest'
build:
context: ./src
dockerfile: ./src/Dockerfile
container_name: foo-app
ports:
- 8080:80
env_file:
- ./src/.env.dev
我要制作图像:
make image-base
export BUILD_ID=20200902-204128-c2aa451
make image-prod
要运行我的容器,我运行
make up env=prod
其中
## up env=<env> : Bring up environments. env values are base,prod,dev,staging. (Not working)
.PHONY: up
up:
docker-compose -f docker-compose.yml -f docker-$(env).yml up -d
要使用docker
构建图像,请按以下方式配置src / Dockerfile:
COPY ./src/php-apache/php.ini /usr/local/etc/php/conf.d/custom.ini
COPY ./src/composer.json /var/www/html/composer.json
但是,要使docker-compose
运行,我需要src / Dockerfile看起来像这样:
COPY ./php-apache/php.ini /usr/local/etc/php/conf.d/custom.ini
COPY ./composer.json /var/www/html/composer.json
请注意缺少的/src
路径。
是的,我已将docker-compose.yml文件更改为:
build:
context: .
dockerfile: ./Dockerfile
它没有帮助。
我需要怎么做才能获得相同的环境(?)以使用docker构建映像并使用docker-compose构建/运行容器?
解决方法
您正在两个版本之间更改上下文。 COPY命令会将文件从上下文复制到图像中。
在此命令中:
docker image build --tag src:$(BUILD_ID)-base \
-f src/Dockerfile \
--target baseImage \
--build-arg BUILD_ID='$(BUILD_ID)' \
--build-arg BUILD_DATE='$(BUILD_TIME_RFC_3339)' \
--build-arg VCS_REF='$(VCS_REF)' \
.
上下文是最后一个arg .
或当前目录。在撰写文件中:
version: '3.8'
services:
php-apache:
image: 'src:latest'
build:
context: ./src
dockerfile: ./src/Dockerfile
上下文是./src
。而当您更改为:
build:
context: .
dockerfile: ./Dockerfile
这将需要将撰写文件移至与Dockerfile相同的目录中。
要复制您的docker build
命令,撰写文件应为:
version: '3.8'
services:
php-apache:
image: 'src:latest'
build:
context: .
dockerfile: ./src/Dockerfile
我已经在自己的实验室中通过以下方式重现了这一点:
$ tree .
.
├── docker-compose.yml
└── src
├── Dockerfile
└── test.txt
$ cat docker-compose.yml
version: '3.8'
services:
test:
image: test-63729350:latest
build:
context: .
dockerfile: src/Dockerfile
$ cat src/Dockerfile
FROM busybox
COPY src/test.txt .
$ docker-compose build
Building test
Step 1/2 : FROM busybox
---> c7c37e472d31
Step 2/2 : COPY src/test.txt .
---> 33dc5a1ac7a1
Successfully built 33dc5a1ac7a1
Successfully tagged test-63729350:latest
$ docker run -it --rm test-63729350:latest ls -al
total 48
drwxr-xr-x 1 root root 4096 Sep 3 18:51 .
drwxr-xr-x 1 root root 4096 Sep 3 18:51 ..
-rwxr-xr-x 1 root root 0 Sep 3 18:51 .dockerenv
drwxr-xr-x 2 root root 12288 Jun 27 00:21 bin
drwxr-xr-x 5 root root 360 Sep 3 18:51 dev
drwxr-xr-x 1 root root 4096 Sep 3 18:51 etc
drwxr-xr-x 2 nobody nogroup 4096 Jun 27 00:21 home
dr-xr-xr-x 412 root root 0 Sep 3 18:51 proc
drwx------ 2 root root 4096 Jun 27 00:21 root
dr-xr-xr-x 13 root root 0 Sep 3 18:51 sys
-rw-r--r-- 1 root root 10 Sep 3 18:44 test.txt
drwxrwxrwt 2 root root 4096 Jun 27 00:21 tmp
drwxr-xr-x 3 root root 4096 Jun 27 00:21 usr
drwxr-xr-x 4 root root 4096 Jun 27 00:21 var
,
感谢@BMitch向我指出正确的方向。
我进行了以下更改:
- docker构建上下文从
.
更改为./src
。 - docker compose
context
从./src
更改为.
,而dockerfile
从./src/Dockerfile
更改为./Dockerfile
。 - 从Dockerfile COPY命令中删除了
src/
。
现在可以构建了!我希望这是正确的方法。
(TBH,我不确定它是在建造The Right Thing,但在建造!)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。