镜像相同的Docker容器无法正常工作

时间:2018-11-19 09:16:56

标签: docker docker-compose dockerfile

我的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

当我创建新容器来重新执行该部分时,它不会发出通知。我该如何解决?

如果我转到一个容器并更改符号链接,它也会在另一个容器中自动更改。

2 个答案:

答案 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);

这会将容器分为两个独立的项目。

Link to documentation