我的docker-compose.yml
设置如下:
app:
build:
dockerfile: ./docker/app/Dockerfile.dev
image: test/test:${ENV}-test-app
...
Dockerfile
在这里有此行:
...
RUN ln -s ../overrides/${ENV}/plugins ../plugins
...
还有一个我正在运行的脚本来启动整个环境(它依赖于多个容器,因此我尝试省略无关的信息)。
这是一个bash脚本,运行以下命令:
ENV=$1 docker-compose -p $1 up -d --force-recreate --build app
我想要实现的是我可以同时运行两个应用容器,其工作方式如下:
sh initializer.sh foo -> creates foo-test-app container
sh initializer.sh bar -> creates bar-test-app container
我现在遇到的问题是,即使存在--force-recreate
标志,实际创建的两个图像也被视为具有两个不同标签的同一图像。
当我检查容器时,这是两个容器都有指向以下对象的符号链接:
overrides/foo/plugins
当我创建新容器来重新执行该部分时,它不会发出通知。我该如何解决?
如果我转到一个容器并更改符号链接,它也会在另一个容器中自动更改。
答案 0 :(得分:0)
docker文件中的$ ENV与撰写文件中的$ ENV不同。
运行docker-compose up
时,它可以大致看作是docker build
,后跟docker run
。因此,Docker逐层构建映像,在此阶段没有称为ENV的环境。 $ ENV仅用于docker run
。
虽然可以使用构建阶段的环境变量,但它们是通过ARG
// compose.yml
build:
context: frontend
args:
- BUILD_ENV=${BUILD_ENV}
// dockerfile
ARG BUILD_ENV
RUN ./node_modules/.bin/ng build --$BUILD_ENV
您可以执行此操作来解决您的问题,但是这将为每个项目创建一个图像,您可能不希望这样做。或者,您也可以在入口点脚本中完成此操作。
答案 1 :(得分:0)
在创建容器时,我发现答案在项目标记中。这就是我所做的:
byte[] imgInBytes = Base64.getDecoder().decode(base64Img);
InputStream in = new ByteArrayInputStream(imgInBytes);
BufferedImage bufferedImage = ImageIO.read(in);
File png = new File("ImageAsPNG.png");
ImageIO.write(bufferedImage, "PNG", png);
这会将容器分为两个独立的项目。